设计模式-(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 ...
随机推荐
- JavaScript中上传文件为图片如何读取+JS中如何使用clip()剪切指定区域(UI组件之图片剪裁器)
File读取和FileReader() //获取上传的文件/图片 function getFile(){ var files,len; var reader = new FileReader(); v ...
- idea 神键
http://blog.csdn.net/dc_726/article/details/42784275 idea 中几个十分酸爽的快捷键.
- 大数据学习——yum练习安装mysql
1. 安装mysql 服务器端: yum install mysql-server yum install mysql-devel 2. 安装mysql客户端: yum install mysql 3 ...
- python类中__unicode__和__str__方法的妙用
在python类中有个__str__的特殊方法,该方法可以使print打印出来的东西更美观,在类里就可以定义,如下代码: class Test: def __init__(self, name, jo ...
- 【贪心+前缀】C. Fountains
http://codeforces.com/contest/799/problem/C [题意] 有n做花园,有人有c个硬币,d个钻石 (2 ≤ n ≤ 100 000, 0 ≤ c, d ≤ 100 ...
- [HNOI2015]实验比较 树形dp+组合数学
在合并的时候有可以加等于,或者继续用小于, 比如siz[x]和siz[y]合并,小于的区间为max(siz[x],siz[y])<=k<=siz[x]+siz[y], 然后就是合并成多少个 ...
- CodeForces - 601A The Two Routes
http://codeforces.com/problemset/problem/601/A 这道题没想过来, 有点脑筋急转弯的感觉了 本质上就是找最短路径 但是卡在不能重复走同一个点 ----> ...
- POJ 1017 Packet
http://poj.org/problem?id=1017 有1*1 2*2...6*6的物品 要装在 6*6的parcel中 问最少用多少个parcel 一直没有找到贪心的策略 问题应该出现在 总 ...
- [Bzoj1009][HNOI2008]GT考试(KMP)(矩乘优化DP)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4309 Solved: 2640[Submit][Statu ...
- Protobuf 完整解析 - 公司最常用的数据交互协议
Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关.语言无关.可扩展,可用于通讯协议和数据存储等领域. 数据交互xml.json.pro ...