将抽象化与实现化脱偶,使得二者可以独立地变化。

桥梁模式的结构

桥梁模式是对象的结构模式。

如上图所示,系统含有两个等级结构:

  • 由抽象化角色和修正抽象化角色组成的抽象化等级结构。
  • 由实现化角色和两个具体实现化角色所组成的实现化等级结构。

桥梁模式所涉及的角色有:

  • 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
  • 修正抽象(Refined Abstraction)化角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
  • 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。 实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
  • 具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。

对象是对行为的封装,而行为是由方法实现的。在这个示意性系统里,抽象化等级结构中的类封装了operation()方法;而实现化等级结构中的类封装的是operationImp()方法。
抽象化等级结构中的商业方法通过向对应的实现化对象的委派实现自己的功能,这意味着抽象化角色可以通过向不同的实例化对象委派,来达到动态地转换自己的功能的目的。

示意性源码:
抽象化角色,商业方法operation()的实现是通过向实现化对象的委派(调用operationImp()方法)实现的。

abstract public class Abstraction {protected Implementor imp;/*** 某个商业方法*/public void operation() {imp.operationImp();}
}

修正抽象化角色,商业方法被置换掉了。

public class RefinedAbstraction extends Abstraction {/*** 某个商业方法在修正抽象化角色的实现*/public void operation() {// improved logic}
}

实现化角色抽象类Implementor中声明一个抽象方法operationImp(),这个方法必须由具体子类实现。

abstract public class Implementor {/*** 某个商业方法的实现化声明*/public abstract void operationImp();
}

具体实现化角色实现了抽象类Implementor所声明的商业方法operationImp()。

public class ConcreteImplementorA extends Implementor {/*** 某个商业方法的实现化实现*/public void operationImp() {System.out.println("Do something...");}
}

一般而言,实现化角色中的每一个方法都应当有一个抽象化角色中的某一个方法与之相对应,但是,反过来则不一定。换言之,抽象化角色的接口比实现化角色的接口宽。抽象化角色除了提供与实现化角色相关的方法之外,还有可能提供其他的商业方法;而实现化角色则往往仅为实现抽象化角色的相关行为而存在。

举个例子

空中巴士(Airbus)、波音(Boeing)和麦道(McDonnell-Douglas)都是飞机制造商,它们都生产载客飞机(Passenger Plane)和载货飞机(Cargo Plane)。现在需要设计一个系统,描述这些飞机制造商以及它们所制造的飞机种类。

设计方案一

在这个设计方案里,有两个子接口:客机和货机。所有的具体飞机又都要继承自Airbus,Boeing和MD等超类。这样一来,每一个具体飞机都带有两个超类型:飞机制造商类型,客、货机类型。

这样设计造成具体飞机与飞机制造商、飞机种类之间的耦合过强,无法满足“开-闭原则”:

  • 需要向系统引进新的飞机制造商;
  • 需要向系统引进新的飞机类型。
设计方案二

桥梁模式,抽象化角色——飞机的种类,实现化角色——飞机制造商。

客机和货机经过一个飞机的“转世”桥梁,可以分别“投胎”到空中巴士、波音和麦道等飞机制造商哪里,“出生”为不同牌子的飞机。
由于这个“转世”桥梁实际上是一个聚合关系,因此可以动态地变化。所以如果系统需要加入新的飞机种类或者飞机制造商的话,已有的各个角色不必改变,需要改变的仅仅是一个多态性的聚合关系。
示意性源代码:
抽象化角色类Airplane。

abstract public class Airplane {protected AirplaneMaker airplaneMaker;abstract public void fly();protected Airplane(AirplaneMaker airplaneMaker) {this.airplaneMaker = airplaneMaker;}
}

载客飞机和载货飞机属于修正抽象化角色。

public class PassengerPlane extends Airplane {public void fly() {// Write your code hereairplaneMaker.produce();}public PassengerPlane(AirplaneMaker airplaneMaker) {super(airplaneMaker);}
}public class CargoPlane extends Airplane {public void fly() {// Write your code hereairplaneMaker.produce();}public CargoPlane(AirplaneMaker airplaneMaker) {super(airplaneMaker);}
}

实现化角色是飞机制造商AirplaneMaker,给出修正抽象化角色所需要实现的接口。

abstract public class AirplaneMaker {abstract public void produce();
}

具体实现化角色是Airbus、Boeing、MD。

public class Airbus extends AirplaneMaker {public void produce() {// Write your code hereSystem.out.println("produce by Airbus");}
}public class Boeing extends AirplaneMaker {public void produce() {// Write your code hereSystem.out.println("produce by Boeing");}
}public class MD extends AirplaneMaker {public void produce() {// Write your code hereSystem.out.println("produce by MD");}
}

客户端代码。

public class BridgePatternDemo {public static void main(String[] args) {Airplane mdPassengerPlane = new PassengerPlane(new MD());Airplane mdCargoPlane = new CargoPlane(new MD());     mdPassengerPlane.fly();mdCargoPlane.fly();Airplane boeingPassengerPlane = new PassengerPlane(new Boeing());Airplane boeingCargoPlane = new CargoPlane(new Boeing());boeingPassengerPlane.fly();boeingCargoPlane.fly();}
}

现在,如果需要增加新的飞机制造商或者新的飞机种类,只需要向系统引进一个新的修正抽象化角色或者一个新的具体实现化角色即可。即系统的功能可以在不修改已有代码的情况下得到扩展,符合“开-闭”原则。

Java与模式学习笔记 —— 桥梁(Bridge)模式相关推荐

  1. 设计模式学习笔记--桥梁(Bridge)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式 ...

  2. 设计模式学习笔记——桥接(Bridge)模式

    设计模式学习笔记--桥接(Bridge)模式 @(设计模式)[设计模式, 桥接模式, bridge] 设计模式学习笔记桥接Bridge模式 基本介绍 类的功能层次结构 类的实现层次结构 使用桥接模式的 ...

  3. Java与模式学习笔记 —— 合成(Composite)模式

    合成模型模式属于对象的结构模式,又称作部分-整体(Part-Whole)模式.合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 一.树结构 ...

  4. 原型模式 java 深浅_java学习笔记之原型模式及深浅拷贝

    一.原型模式的基本介绍 在聊原型模式之前,我们来思考一个小问题,传统的方式我们是如何克隆对象呢? 那我们以多利羊(Sheep)为例,来说明上述这个问题,具体代码见下面: 多利羊(Sheep) publ ...

  5. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

  6. java/android 设计模式学习笔记(8)---桥接模式

    这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一.桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分 ...

  7. java/android 设计模式学习笔记(3)---工厂方法模式

    这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或 ...

  8. java/android 设计模式学习笔记(7)---装饰者模式

    这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...

  9. 打印鸭子戏水java,《Head first设计模式》学习笔记 #8211; 策略模式,

    <Head first设计模式>学习笔记 – 策略模式, 策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 假设有一个模拟鸭子的游戏,游 ...

最新文章

  1. 个人管理:简单,我微博中的一句话,总有你喜欢的
  2. 一位老工程师的终告 (推荐)
  3. excel可视化图表插件_Axure 教程:利用图表前端插件实现高级可视化图表
  4. 【阅读推荐】LiveVideoStack 精彩内容集锦
  5. exe打包工具哪个最好_为你的 Python 程序写个启动工具箱
  6. 用python读取股票价格_Python读取文件并给出股票价格
  7. 后端传输流跨域_Java开发中解决Js的跨域问题过程解析
  8. Hyperledger Fabric 网络搭建详解
  9. 委托与Lambda表达式
  10. FreeSWITCH mod_callcenter 整理
  11. 计算机数学ppt,数学工具 PPT版
  12. 开源磁盘加密软件VeraCrypt教程
  13. 74CMS的RCE挖掘思路
  14. 怎么设置代理服务器IP上网
  15. 《CRAFT:Character Region Awareness for Text Detection》论文笔记
  16. SpringBoot应用监控(带邮件警报)
  17. spyder 5.0.0 提示依赖项spyder-kernels版本错误
  18. 字符串匹配算法之BM算法
  19. 正则表达式提取html内容
  20. 【shell】笔记|去重复行|删除匹配行|反选删除|反向显示|加减乘除

热门文章

  1. KRFKKFFKKVKKSVKKRLKKIFKKPMVIGVTIPF-NH2|1818372-26-7
  2. java启动器_Minecraft Java版新启动器正式开放
  3. 1224. 交换瓶子
  4. 百度云爬虫_python
  5. 当当活动 | 先读书,后浪
  6. php如何实现余额充值,请问应用中实现绑定银行卡并进行消费、充值、提现一般是怎么搞的?...
  7. IDEA Maven 多module项目导入 pom文件报错解决记录
  8. linux学习34-运维自动化之ANSIBLE
  9. 持续集成(三)- hudson插件入门
  10. web前端基础——rotate实现旋转效果