一,概念

  桥接模式为把抽象层次结构从实现中分离出来,使其可以独立变更,抽象层定义了供客户端使用的上层抽象接口,实现层次结构定义了供抽象层次使用的底层接口,实现类的引用被封装于抽象层的实例中,桥接就形成了.

  桥接模式可以解决具有功能类似但又不完全相同的某种功能架构,为了能让实现更加灵活.

二,结构图

  

  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版)的更多相关文章

  1. iOS可视化动态绘制八种排序过程(Swift版)

    前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...

  2. Swift版iOS游戏框架Sprite Kit基础教程下册

    Swift版iOS游戏框架Sprite Kit基础教程下册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C 介绍:本教程是国内唯一的Swift版的Spritekit教程. ...

  3. Swift版音乐播放器(简化版),swift音乐播放器

    这几天闲着也是闲着,学习一下Swift的,于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神, 希望对大家有帮助! 这个DEMO里,使用到了 AudioPlayer(对音 ...

  4. 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)

    原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...

  5. 快速排序OC、Swift版源码

    前言: 你要问我学学算法在工作当中有什么用,说实话,当达不到那个地步的时候,可能我们不能直接的感觉到它的用处!你就抱着这样一个心态,当一些APP中涉及到算法的时候我不想给其他人画界面!公司的项目也是暂 ...

  6. swift版的CircleView

    swift版的CircleView 效果图 源码 // // CircleView.swift // CircleView // // Created by YouXianMing on 15/10/ ...

  7. swift版的GCD封装

    swift版的GCD封装 说明 本人针对swift封装了GCD,包括GCDQueue,GCDGroup,GCDTimer以及GCDSemaphore,使用较为便利. 源码 https://github ...

  8. swift版的StringAttribute

    swift版的StringAttribute 效果 源码 https://github.com/YouXianMing/Swift-StringAttribute // // StringAttrib ...

  9. swift版的元组

    swift版的元组 说明 元组的内容并不多,使用的话跟普通变量类似,以下是测试源码: // // ViewController.swift // Tuples // // Created by You ...

  10. swift版的枚举变量

    swift版的枚举变量 swift的枚举类型跟普通的类是极为类似的,使用的时候,请不要以为他是一个常量,以下是测试用源码 // // ViewController.swift // SwiftEnum ...

随机推荐

  1. LeetCode(65) Valid Number

    题目 Validate if a given string is numeric. Some examples: "0" => true " 0.1 " ...

  2. JavaScript高级程序设计中第2、3章中细节知识点

    第2章 1.<script src='script.js' type='text/javascript'></script>中,只要不包含defer和async属性,浏览器都会 ...

  3. (转)]PYTHON Tkinter GUI

    import Tkinterroot=Tkinter.Tk()label=Tkinter.Label(root,text='hello ,python')label.pack()      #将LAB ...

  4. IDEA将Maven项目中src源代码下的xml配置文件编译进classes

    遇到这样的情况,maven项目启动报错,src中某个包下面的xml文件找不到. eclipse编译项目会自动将xml配置文件编译进classes,IDEA却不行 在报错项目的pom.xml文件中添加: ...

  5. python025 Python3 正则表达式

    Python3 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. ...

  6. 【BZOJ2006】超级钢琴(RMQ,priority_queue)

    题意: 思路: 用三元组(i, l, r)表示右端点为i,左端点在[l, r]之间和最大的区间([l, r]保证是对于i可行右端点区间的一个子区间),我们用堆维护一些这样的三元组. 堆中初始的元素为每 ...

  7. Last Defence - UVA7045

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  8. Java中的字符

    以下内容引用自http://wiki.jikexueyuan.com/project/java/characters.html: 一般情况下,当处理字符时,使用的是原始数据类型char. 示例: ch ...

  9. SeaGlass:手工搭建伪基站监控系统

    “伪基站”即假基站,设备一般由主机和笔记本电脑或手机组成,通过短信群发器.短信发信机等相关设备能够搜取以其为中心.一定半径范围内的手机卡信息,利用2G移动通信的缺陷,通过伪装成运营商的基站,冒用他人手 ...

  10. Android 自己定义View须要重写ondraw()等方法

    Android  自己定义View须要重写ondraw()等方法.这篇博客给大家说说自己定义View的写法,须要我们继承View,然后重写一些 方法,方法多多,看你须要什么方法 首先写一个自己定义的V ...