设计模式-(7)桥接(swift版)
一,概念
桥接模式为把抽象层次结构从实现中分离出来,使其可以独立变更,抽象层定义了供客户端使用的上层抽象接口,实现层次结构定义了供抽象层次使用的底层接口,实现类的引用被封装于抽象层的实例中,桥接就形成了.
桥接模式可以解决具有功能类似但又不完全相同的某种功能架构,为了能让实现更加灵活.
二,结构图

Abstraction:定义中所说的抽象部分,通常在这个对象里面,要维护一个实现部分的对象引用,在抽象对象里面的方法,需要调用实现部分的对象来完成。这个对象里面的方法,通常都是跟具体的业务相关的方法。在上面手机的例子中,可以理解为手机品牌接口;
Implementor:定义中所说的实现部分,这个接口不用和Abstraction里面的方法一致,通常是由Implementor接口提供基本的操作,而Abstraction里面定义的是基于这些基本操作的业务方法,也就是说Abstraction定义了基于这些基本操作的较高层次的操作。在上面手机的例子中,可以理解为手机软件接口(也可以是类);
RefinedAbstraction:抽象部分的具体实现,通常在这个对象里面,定义跟实际业务相关的方法,这些方法的实现通常会使用Abstraction中定义的方法,也可能需要调用实现部分的对象来完成。在上面手机的例子中,可以理解为具体的手机品牌,它实现了Abstraction接口;
ConcreteImplementatorA:实现部分的具体实现,在上面手机的例子中,可以理解为具体的手机软件,它实现了(或继承了) Implementor。
三,Demo演示
Abstraction(interface)
protocol PageDataProtocol {
//database
var dataBase: DataBaseProtocol?{get}
/// add one record
///
/// - Parameter record: record information
/// - Returns: whether success
func addOneRecord(record: Dictionary<String, Any>) -> Bool
/// delete one record
///
/// - Parameter recordId: record Id
/// - Returns: whether success
func removeOneRecord(recordId: String) -> Bool
/// get one page list data
///
/// - Parameters:
/// - pageNum: page's num
/// - pageSize: one page's record count
/// - Returns: page list
func pageListData(pageNum: Int, pageSize: Int) -> (Array<Dictionary<String, Any>>)?
}
RefineAbstraction
class HomePageData: PageDataProtocol {
var dataBase: DataBaseProtocol?
init(database: DataBaseProtocol) {
self.dataBase = database;
}
func addOneRecord(record: Dictionary<String, Any>) -> Bool {
if dataBase != nil {
return dataBase!.insertRecord(record: record)
}else{
print("database not exist")
return false;
}
}
func removeOneRecord(recordId: String) -> Bool {
if dataBase != nil {
return dataBase!.deleteRecord(recordId: recordId)
}else{
print("database not exist")
return false;
}
}
func pageListData(pageNum: Int, pageSize: Int) -> (Array<Dictionary<String, Any>>)? {
if dataBase != nil {
return dataBase!.selectRecords(start:pageNum,length:pageSize)
}else{
print("database not exist")
return nil;
}
}
}
Implementor
protocol DataBaseProtocol {
/// insert one record
///
/// - Parameter record: record
/// - Returns: whether success
func insertRecord(record: Dictionary<String, Any>) -> Bool
/// remove one record
///
/// - Parameter recordId: record id
/// - Returns: whether success
func deleteRecord(recordId: String) -> Bool
/// update one record
///
/// - Parameter record: record
/// - Returns: whether success
func updateRecord(record: Dictionary<String, Any>) -> Bool
/// query records
///
/// - Parameters:
/// - start: the start index
/// - length: one page's length
/// - Returns: records queried
func selectRecords(start: Int, length: Int) -> Array<Dictionary<String, Any>>
}
ConcrateImplementorA
class DataBaseA: DataBaseProtocol {
func insertRecord(record: Dictionary<String, Any>) -> Bool {
print("DB_A insert \(record)")
return true
}
func deleteRecord(recordId: String) -> Bool {
print("DB_A delete \(recordId)")
return true
}
func updateRecord(record: Dictionary<String, Any>) -> Bool {
print("DB_A update \(record)")
return true
}
func selectRecords(start: Int, length: Int) -> Array<Dictionary<String, Any>> {
print("DB_A query \(start) \(length)")
return [["name":"xiaoming"],["name":"xiaogang"]]
}
}
ConcrateImplementorB
class DataBaseB: DataBaseProtocol {
func insertRecord(record: Dictionary<String, Any>) -> Bool {
print("DB_B insert \(record)")
return true
}
func deleteRecord(recordId: String) -> Bool {
print("DB_B delete \(recordId)")
return true
}
func updateRecord(record: Dictionary<String, Any>) -> Bool {
print("DB_B update \(record)")
return true
}
func selectRecords(start: Int, length: Int) -> Array<Dictionary<String, Any>> {
print("DB_B query \(start) \(length)")
return [["name":"b_x"],["name":"b_g"]]
}
}
Client
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var homePageData = HomePageData(database: DataBaseA())
print(homePageData.pageListData(pageNum:0, pageSize:10))
homePageData = HomePageData(database: DataBaseB())
print(homePageData.pageListData(pageNum:0, pageSize:10))
}
}
设计模式-(7)桥接(swift版)的更多相关文章
- iOS可视化动态绘制八种排序过程(Swift版)
前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...
- Swift版iOS游戏框架Sprite Kit基础教程下册
Swift版iOS游戏框架Sprite Kit基础教程下册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C 介绍:本教程是国内唯一的Swift版的Spritekit教程. ...
- Swift版音乐播放器(简化版),swift音乐播放器
这几天闲着也是闲着,学习一下Swift的,于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神, 希望对大家有帮助! 这个DEMO里,使用到了 AudioPlayer(对音 ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- 快速排序OC、Swift版源码
前言: 你要问我学学算法在工作当中有什么用,说实话,当达不到那个地步的时候,可能我们不能直接的感觉到它的用处!你就抱着这样一个心态,当一些APP中涉及到算法的时候我不想给其他人画界面!公司的项目也是暂 ...
- swift版的CircleView
swift版的CircleView 效果图 源码 // // CircleView.swift // CircleView // // Created by YouXianMing on 15/10/ ...
- swift版的GCD封装
swift版的GCD封装 说明 本人针对swift封装了GCD,包括GCDQueue,GCDGroup,GCDTimer以及GCDSemaphore,使用较为便利. 源码 https://github ...
- swift版的StringAttribute
swift版的StringAttribute 效果 源码 https://github.com/YouXianMing/Swift-StringAttribute // // StringAttrib ...
- swift版的元组
swift版的元组 说明 元组的内容并不多,使用的话跟普通变量类似,以下是测试源码: // // ViewController.swift // Tuples // // Created by You ...
- swift版的枚举变量
swift版的枚举变量 swift的枚举类型跟普通的类是极为类似的,使用的时候,请不要以为他是一个常量,以下是测试用源码 // // ViewController.swift // SwiftEnum ...
随机推荐
- 剑指Offer(书):数组中重复的数字
题目:找出数组中重复的数字. 说明:在一个长度为n的数组里的所有数字都在0~n-1的范围内,数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数 ...
- POJ 3659 Cell phone Network (树的最小点覆盖, 树形DP)
题意: 给定一棵树,每个点可以覆盖自己和相邻的点, 求最少要多少个点覆盖图 #include <cstdio> #include <cstring> #include < ...
- c和c++如何把一个整数转化为string
c和c++如何把一个整数转化为string C++: 一.string转int的方式 采用最原始的string, 然后按照十进制的特点进行算术运算得到int,但是这种方式太麻烦,这里不介绍了. 采用标 ...
- MySQL索引与Index Condition Pushdown(二)
实验 先从一个简单的实验开始直观认识ICP的作用. 安装数据库 首先需要安装一个支持ICP的MariaDB或MySQL数据库.我使用的是MariaDB 5.5.34,如果是使用MySQL则需要5.6版 ...
- Laya Tween 和 遮罩
Laya Tween 和 遮罩 @author ixenos 场景:在使用Tween循环时,不规则物体部分超出范围 方案:使用遮罩定型 困境:在laya ide设计模式中将遮罩sprite放到不规则物 ...
- Linux 磁盘测速
读: time dd if=/dev/zero of=/test.dbf bs=8k count=1000000 写: time dd if=/dev/zero of=/var/test bs=8k ...
- 【python可视化系列】python数据可视化利器--pyecharts
学可视化就跟学弹吉他一样,刚开始你会觉得自己弹出来的是噪音,也就有了在使用python可视化的时候,总说,我擦,为啥别人画的图那么溜: [python可视化系列]python数据可视化利器--pyec ...
- 【dfs+理解题意+构造】【待重做】codeforces E. Ice cream coloring
http://codeforces.com/contest/805/problem/E [题意] 染色数是很好确定,最少染色数是max(si)(最小为1,即使所有的si都为0,这样是单节点树形成的森林 ...
- SeLion数据驱动中遇到的问题,以及解决方案
问题描述: 使用selion框架数据驱动时,总是test ignored. 解决方案: 把这个dataprovider方法拿出来做单元测试.有详细报错. 问题1:使用wps保存,poi包只能解析xls ...
- Scrapy的log日志功能
Logging Scrapy提供了log功能,可以通过 logging 模块使用 可以修改配置文件settings.py,任意位置添加下面两行 LOG_FILE = "mySpider.lo ...