设计模式-(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 ...
随机推荐
- POJ 3310 Caterpillar(图的度的判定)
题意: 给定一幅图, 问符不符合一下两个条件: (1) 图中没有环 (2)图中存在一条链, 点要么在链上, 要么是链上点的邻居. 分析: 建图,记录度数, 去掉所有度为1的点, 然后看看剩下是否是有2 ...
- mysql异常Incorrect string value: '\xE6\xB5\x8B\xE8\xAF\x95' for column 'region_name'
Incorrect string value: '\xE6\xB5\x8B\xE8\xAF\x95' for column 'region_name' insert语句加的该字段有汉字,乱码造成的 解 ...
- python中的“坑”—持续更新
1.判断是否是回文 def is_back(s): ]==(s if s.strip() else False) print(is_back('上海自来水来自海上')) print(is_back(' ...
- 常见Bean映射工具分析评测及Orika介绍
原地址:http://tech.dianwoda.com/2017/11/04/gao-xing-neng-te-xing-feng-fu-de-beanying-she-gong-ju-orika/ ...
- hihoCoder #1067 : 最近公共祖先·二 [ 离线LCA tarjan ]
传送门: #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站 ...
- Separate code and data contexts: an architectural approach to virtual text sharing
The present invention provides a processor including a core unit for processing requests from at lea ...
- linux 开机启动脚本或者服务
https://blog.csdn.net/zhuchunyan_aijia/article/details/53811368
- ASP.NET Core小技巧
设定开发环境为开发模式,呈现具体错误内容 dotnet run启动时,会在环境变量中查找ASPNETCORE_ENVIRONMENT变量的值,如果没有,则默认会当做Production来处理,隐藏错误 ...
- 通过简单的两数相加体会hashmap的好处
目录 引入题目:两数相加 HashMap相关知识: Map集合 Map集合的特点 Map常用子类 HashMap集合 LinkedHashMap集合 Map集合的常用方法 Map集合的第一种遍历方式: ...
- java IO与NIO
场景:IO适用于大而少,NIO适用于小而多 转载:https://www.cnblogs.com/kzfy/p/5063467.html 传统的socket IO中,需要为每个连接创建一个线程,当并发 ...