桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

大话设计模式中程杰老师给出的定义是,桥接模式:将抽象部分与实现部分分离,使它们都可以独立的变化

首先我们来看一个问题:现在我有一个N品牌一个M品牌的手机,两个品牌的手机都有两种功能:游戏和通讯录,我们该如何实现?

依据面向对象的理论设计,我们有两种设计思想:

实现一:先有一个品牌,多个品牌就抽象出一个品牌抽象类,对于每个功能,就都继承各自的品牌;

实现二:先有功能,多个功能就可以抽象出一个抽象功能类,对于每个手机品牌,分别去继承各个功能;

上面的设计完美的遵循了面向对象的原则,但是,问题也随之而来,如果我现在需要给每个品牌都增加一个MP3播放器功能,我们该怎么办?

对于实现一,我们需要在每个品牌下面分别增加一个MP3播放器功能;对于实现二,我们需要在手机软件下增加一个抽象的MP3播放器功能,然后各个手机品牌再分别去继承这个功能。

如果我们需要再增加一个手机品牌呢?那我们要改动的地方就越来越多了。显然这种设计似乎有问题的。

但我们学会使用面向对象的继承时,确实感觉它非常强大,但是并不是所有的情况都可以使用面向对象的继承,而且有很多情况下,使用继承会带来麻烦。比如,对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化都必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其它更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

就像我们上面的两种实现,如果不断地增加新的手机品牌和功能,类会越来越多。怎么解决呢?面向对象设计中还有一个很重要的原则合成/聚合复用原则,即优先使用对象合成/聚合,而不是类继承

合成表示一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样,打个比方:人有两个胳膊,胳膊和人就是部分和整体的关系,人去世了,那么胳膊也就没用了,也就是说胳膊和人的生命周期是相同的,合成关系用实心的菱形+实线来表示。

合成/聚合复用规则的好处:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持在一个较小的规模,并且不太可能增长为不可控制的庞然大物。

下面我么来看看遵循合成/聚合复用规则的实现三:

桥接模式的核心意图就是把这些实现独立出来,让它们各自的变化。这就使得每种实现的变化不会影响其它的实现,从而达到应对变化的目的。

代码实现:

package com.bridge;public abstract class Implementor {public abstract void operation();}
package com.bridge;public class ConcreteImplementorA extends Implementor {@Overridepublic void operation() {System.out.println("具体实现A执行");}}
package com.bridge;public class ConcreteImplementorB extends Implementor {@Overridepublic void operation() {System.out.println("具体实现B执行");}}
package com.bridge;public abstract class Abstraction {protected Implementor implementor;public void setImplementor(Implementor implementor){this.implementor = implementor;}public void operation(){implementor.operation();}}
package com.bridge;public class RefinedAbstraction extends Abstraction {public void operation(){implementor.operation();}}
package com.bridge;public class BridgePatternDemo {public static void main(String[] args) {Abstraction ab = new RefinedAbstraction();ab.setImplementor(new ConcreteImplementorA());ab.operation();ab.setImplementor(new ConcreteImplementorB());ab.operation();}}

运行结果:

具体实现A执行
具体实现B执行

应用实例: 墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。

优点:

1、抽象和实现的分离。
2、优秀的扩展能力。
3、实现细节对客户透明。

缺点

桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

使用场景:

1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展,对于两个独立变化的维度,使用桥接模式再适合不过了。

大话设计模式—桥接模式相关推荐

  1. linkin大话设计模式--桥接模式

    linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...

  2. linkin大话设计模式--常用模式总结

    linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...

  3. Python设计模式-桥接模式

    Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...

  4. 【学习笔记】ABAP OOD设计模式 - 桥接模式

    ABAP OOD设计模式 - 桥接模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 桥接模式又称为桥梁模式,在程序开发中,采用不同的维度分解一系列对象,然后采用组 ...

  5. 跟着ZHONGHuan学习设计模式--桥接模式

    转载请注明出处! ! !http://blog.csdn.net/zhonghuan1992 全部配套代码均在github上:https://github.com/ZHONGHuanGit/Desig ...

  6. 2.设计模式-桥接模式

    文章目录 一.使用场景 二.实现方法 三.优势与劣势 四.经典案例 本文笔记来自于: 狂神的设计模式 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构模型,又称为柄体( ...

  7. 设计模式--桥接模式(Bridge)

    设计模式–桥接模式(Bridge) 1.定义 桥接模式:将抽象部分与它的实现部分分离,使它们可以独立地变化. 2.实例 设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图 ...

  8. linkin大话设计模式--模板方法模式

    linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...

  9. 23种设计模式——桥接模式

    文章目录 23种设计模式--桥接模式 1.桥接模式概述 2.桥接模式结构 3.桥接模式的实现 4.桥接模式的注意事项和细节 23种设计模式--桥接模式 1.桥接模式概述 桥接模式介绍 桥接(Bridg ...

最新文章

  1. Python进阶06 循环对象
  2. 追加的英文计算机,Latex同时添加中英文摘要
  3. java 获得响应内容_Java 纯HTTP Get请求获取响应内容,如果302,继而获取重定向后的响应内容。...
  4. oozie mysql_【oozie】将oozie的数据库配置为mysql | 学步园
  5. web自动化如何在不同浏览器运行_如何给树莓派搭建WEB开发运行环境之JAVA篇
  6. 清理rms客户端信息
  7. AS技巧合集「调试技巧篇」
  8. Atitit ati擅长领域总结 目录 1.1. 要点::文化 教育 祭祀(spec ,bp ??) 2 1.2. 项目提取共同特点》》产品》》内部产品+tool》》sdk》》spec》》准则
  9. vue 背景弹出禁止滚动_vue-蒙层弹窗里的内容滚动。外层大页面禁止滚动
  10. java 毫秒转分钟和秒_Java程序将毫秒转换为分钟和秒
  11. 小米开发版安装magisk_小米9SE不刷recovery直接安装Magisk面具的详细教程
  12. java 支付宝对账文件处理,支付宝账单下载读文件解析
  13. 第三次作业--结对编程
  14. 教教大家Win10怎么看处理器是几核
  15. 蓝桥杯——算法训练——P0704
  16. 巴比特 | 元宇宙每日必读:企业需要具备哪些资质才能开展NFT相关业务?
  17. 求1-100之间的和
  18. c语言1h什么意思,标准现代精确——1C开叫1H应叫及其他应叫
  19. 成长Taller-是否有可能
  20. 进程导入表修复工具——Universal Import Fixer

热门文章

  1. 准备写个delphi 代码生成器或者说是一个记事本
  2. windows消息定义
  3. Mac OS X连载-1。启动模式小技巧
  4. android 追加写入数据到文件
  5. android DecorView的使用
  6. android 将byte[]保存到手机
  7. Git新建分支出现fatal: Not a valid object name: ‘master‘错误
  8. react监听input框里的值
  9. maven仓库执行脚本(clearLastUpdated.bat)
  10. tomcat 下catalina.out 日志乱码问题处理