第二十四章、桥接模式

桥接模式也称为桥梁模式,是结构型设计模式之一。桥接模式中体现了“单一职责原则”、“开闭原则”、“里氏替换原则”、“依赖倒置原则”等。同时它也是很实用的一种模式。

1.定义

将抽象部分与现实部分分离,使它们都可以独立地进行变化。

2.使用场景

(1)如果一个系统需要在构建的抽象化角色和具体角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系。

(2)对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,也可以考虑使用桥接模式。

(3)一个类存在两个独立变化的维度,且这两个维度都需要扩展。

3.UML类图

(1)Abstraction:抽象部分,该类保持一个对实现部分对象的引用,抽象部分中的方法需要调用实现部分的对象来实现,该类一般为抽象类。

(2)RefinedAbstraction:优化抽象部分,抽象部分的具体实现,该类一般是对抽象部分的方法进行完善和扩展。

(3)Implementor:实现部分。可以为接口或抽象类,其方法不一定要与抽象部分中的一致,一般情况下是由现实部分提供基本操作,而抽象部分定义的则是基于实现部分这些基本操作的业务方法。

(4)ConcreteImplementorAConcreteImplementorB:实现部分的具体实现。完善实现部分中的方法定义的具体逻辑。

4.简单实现

以去咖啡店喝咖啡为例,我们假定咖啡有大杯加糖、大杯不加糖、小杯加糖和小杯不加糖四种。

给咖啡添加东西的抽象类:(Implementor)

public abstract class CoffeeAdditives {/*** 具体要往咖啡里添加什么东西 * * @param 具体添加的东西*/public abstract String addSomething();
}

加糖类实现:(ConcreteImplementorA)

public class Sugar extends CoffeeAdditives{@Overridepublic String addSomething() {return "加糖";}}

原味类实现:(ConcreteImplementorB)

public class Ordinary extends CoffeeAdditives{@Overridepublic String addSomething() {return "原味";}}

咖啡类:(Abstraction)

public abstract class Coffee{protected CoffeeAdditives impl;public Coffee(CoffeeAdditives impl) {this.impl = impl;}/*** 咖啡具体什么样由子类决定 */public abstract void makeCoffee();
}

大杯咖啡:(RefinedAbstraction)

public class LargeCoffee extends Coffee{public LargeCoffee(CoffeeAdditives impl) {super(impl);}@Overridepublic void makeCoffee() {System.out.println("大杯的" + impl.addSomething() + "咖啡");}}

小杯咖啡:

public class SmallCoffee extends Coffee{public SmallCoffee(CoffeeAdditives impl) {super(impl);}@Overridepublic void makeCoffee() {System.out.println("小杯的" + impl.addSomething() + "咖啡");}
}

调用:

public class Client {public static void main(String[] args) {//原味Ordinary implOrdinary = new Ordinary();//加糖Sugar implSugar = new Sugar();//大杯咖啡  原味LargeCoffee largeCoffeeOrdinary = new LargeCoffee(implOrdinary);largeCoffeeOrdinary.makeCoffee();//小杯咖啡  原味SmallCoffee smallCoffeeOrdinary = new SmallCoffee(implOrdinary);smallCoffeeOrdinary.makeCoffee();//大杯咖啡  加糖LargeCoffee largeCoffeeSugar = new LargeCoffee(implSugar);largeCoffeeSugar.makeCoffee();//小杯咖啡  加糖SmallCoffee smallCoffeeSugar = new SmallCoffee(implSugar);smallCoffeeSugar.makeCoffee();}}

结果:

大杯的原味咖啡
小杯的原味咖啡
大杯的加糖咖啡
小杯的加糖咖啡

5.Android源码中的桥接模式

1.Window与WindowManager

主要代码如下:

public abstract class Window {//部分省略/*** Set the window manager for use by this Window to, for example,* display panels.  This is <em>not</em> used for displaying the* Window itself -- that must be done by the client.** @param wm The window manager for adding new windows.*/public void setWindowManager(WindowManager wm, IBinder appToken, String appName) {setWindowManager(wm, appToken, appName, false);}/*** Set the window manager for use by this Window to, for example,* display panels.  This is <em>not</em> used for displaying the* Window itself -- that must be done by the client.** @param wm The window manager for adding new windows.*/public void setWindowManager(WindowManager wm, IBinder appToken, String appName,boolean hardwareAccelerated) {mAppToken = appToken;mAppName = appName;mHardwareAccelerated = hardwareAccelerated|| SystemProperties.getBoolean(PROPERTY_HARDWARE_UI, false);if (wm == null) {wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);}//*将Window与WindowManager绑定mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);}//部分省略}

6.总结

1.优点

(1)分离抽象与现实、灵活的扩展以及对客户来说透明的实现。

(2)桥接模式可以取代多层继承,大大减少了子类的个数。

2.缺点

不容易设计,对开发者来说要有一定的经验要求。理解很容易,设计却不容易。

《Android源码设计模式解析与实战》读书笔记(二十四)相关推荐

  1. 《Android源码设计模式解析与实战》读书笔记(十三)

    第十三章.备忘录模式 备忘录模式是一种行为模式,该模式用于保存对象当前的状态,并且在之后可以再次恢复到此状态,有点像是我们平常说的"后悔药". 1.定义 在不破坏封闭的前提下,捕获 ...

  2. 《Android源码设计模式解析与实战》读书笔记(十七)

    第十七章.中介者模式 中介者模式也称为调解者模式或调停者模式,是一种行为型模式. 1.定义 中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用.从而使它们可以松散耦合.当某些对象之 ...

  3. 《Android源码设计模式解析与实战》读书笔记(十二)

    第十二章.观察者模式 观察者模式是一个使用率非常高的模式,它最常用在GUI系统.订阅–发布系统.因为这个模式的一个重要作用就是解耦,将被观察者和观察者解耦,使得它们之间的依赖性更小,甚至做到毫无依赖. ...

  4. 《Android源码设计模式解析与实战》读书笔记(十四)

    第十四章.迭代器模式 迭代器模式,又叫做游标模式,是行为型设计模式之一.我们知道对容器对象的访问必然会涉及遍历算法,我们可以将遍历的方法封装在容器中,或者不提供遍历方法,让使用容器的人自己去实现去吧. ...

  5. 《Android源码设计模式解析与实战》读书笔记(十)

    第十章.解释器模式 解释器模式是一种用的比较少的行为型模式,其提供了一种解释语言的语法或表达式的方式.但是它的使用场景确实很广泛,只是因为我们自己很少回去构造一个语言的文法,所以使用较少. 1.定义 ...

  6. 《Android源码设计模式解析与实战》读书笔记(二十一)

    第二十一章.装饰模式 装饰模式也称为包装模式,是结构型设计模式之一.装饰模式是一种用于替代继承技术的一种方案. 1.定义 动态的给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵 ...

  7. 《Android源码设计模式解析与实战》读书笔记(十一)

    第十一章.命令模式 命令模式是行为型模式之一.总体来说并不难理解,只是比较繁琐,他会将简单的调用关系解耦成多个部分,增加类的复杂度,但是即便如此,命令模式的结构依然清晰. 1.定义 将一个请求封装成一 ...

  8. 《Android源码设计模式解析与实战》读书笔记(十九)

    第十九章.组合模式 组合模式也称为部分-整体模式,结构型设计模式之一. 1.定义 将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. ...

  9. 《Android源码设计模式解析与实战》读书笔记(十六)

    第十六章.访问者模式 访问者模式是一种行为型模式,它是23种设计模式中最复杂的一个,虽然使用频率不高,但是并不代表可以忽略,在合适的地方,它会带来意想不到的灵活性.访问者模式,顾名思义使用了这个模式后 ...

最新文章

  1. LeetCode - Maximum Depth of Binary Tree
  2. java 并发统计_java并发编程|CountDownLatch计数器
  3. Android 四大组件之——Acitivity(四) Activity是如何加载显示内容的?
  4. C#数组原来这么简单,你学废了吗?
  5. [SpringBoot2]错误处理_默认规则
  6. 电大计算机网考选择题多少分,2016年度电大计算机网考选择题及标准答案.doc
  7. 基于并行附加特征提取网络的SSD地面小目标检测模型
  8. Jser 设计模式系列之面向对象 - 接口封装与继承
  9. 【Java】为什么java构造函数的构造器只能在第一行写this() 或者super() ?
  10. asp.net处理get,post数据
  11. 苹果CoreFoundation源代码
  12. C# 短消息提示 窗口位置
  13. 写给大学男同胞几条择偶建议
  14. kryo com.esotericsoftware.kryo.KryoException: Buffer underflow.
  15. 南京 学计算机的学校,南京小学生暑假学计算机编程去哪家学校好
  16. POJO 与javaBean(普通bean和EJB)
  17. Spring容器框架
  18. 流利说回购,AI教育面临市场培育的“慢时间”尴尬?
  19. 【045】国家标准全文公开系统-GB和GB/T国家标准库
  20. 软考嵌入式系统工程师的十大建议

热门文章

  1. 【javasim】一个java下的建模仿真平台
  2. android 对象存储sd卡,Android网络与数据存储——File存储(实现SD卡文件浏览器)...
  3. 斯坦福学者:生物智能可能是解决AI发展瓶颈的关键
  4. 饥荒开服 - 腾讯云轻量服务器
  5. 快手引流卖什么暴利?很多人现在都觉得在各大平台引流很难
  6. 为什么 Redis 不支持回滚(roll back)
  7. zhs16gbk java 转utf8_ORCALE字符集AL32UTF8和ZHS16GBK的互相转换
  8. 远程视频监控该如何组网
  9. The Earth Rover
  10. 本地宝js爬虫(附代码)