声明:

本节内容源自网络

【一句话介绍】

将抽象 与 实现 脱耦,使二者可以独立的变化。

桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立改变。

桥梁模式目的就是把抽象化角色和实现化角色的强耦合解除掉。

【先混个脸熟】

这个系统包含两个等级结构:抽象等级结构 & 实现等级结构。

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

抽象化角色就像一个水杯的手柄,实体类角色就像水杯的杯身,手柄控制杯身。

【讲个故事】

故事一、大飞机的故事

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

方案① --糟糕的示例

“开-闭 ”原则

这样的设计有一个很大的缺陷:在具体飞机与飞机制造商、飞机种类之间的耦合过强。一旦出现下面的情况,系统设计就不可避免第需要修改。

  • 需要向系统引进新的飞机制造商
  • 需要向系统引进新的飞机类型

组合/聚合复用原则(CARP)

要尽量使用合成/聚合,而不是继承关系来达到扩展系统功能的目的。

组合/聚合复用原则是达到"开-闭"原则要求的必要手段。

这个设计里过多的使用了继承关系,改变这一局面的办法就是放弃继承关系,通过动态的委派改进系统的设计。

方案② --改良

代码:

抽象角色类Airplane

修正抽象化角色载客飞机

public class PassengerPlane extends Airplane {@Overridepublic void fly() {// TODO Auto-generated method stubSystem.out.println("This is Passenger Plane fly.");}}

修正抽象化角色货运飞机

public class CargoPlane extends Airplane {@Overridepublic void fly() {// TODO Auto-generated method stubSystem.out.println("This is CargoPlane fly.");}}

实现化角色(Implementor)-实现化角色的接口--飞机厂商

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

具体实现化角色-空客 波音

public class Airbus extends AirplaneMaker {@Overridepublic void produce(){System.out.println("Airbus>>>>>>>>");}}

【小结】

现在如果需要增加新的飞机制造商或者新的飞机种类,只需要向系统引进一个新的修正抽象化角色,或者一个新的具体实现化角色就可以了。

或者说,系统的功能可以在不修改已有代码的情况下得到扩展。

桥梁模式-设计语言:

使用两个独立的等级结构封装两个独立的变化因素,并在它们之间使用聚合关系,以达到功能复合的目的。

故事二 新老司机开车的故事

对象:

主要有两个类层次结构

一类是司机类,有老司机、新手

二类是汽车类,有奔驰、奥迪、宝马

【代码】

①抽象化角色-司机类

/*** @author         * @version        V1.0  * @Date           2017年11月30日 下午1:52:27 * @Email* @Description:   桥接模式 -司机抽象类*/public abstract class Driver {private Car car;public abstract void drive();public Car getCar() {return car;}public void setCar(Car car) {this.car = car;}}

*此处没有把car写到构造函数参数中,主要考虑是降耦;

②实现化角色-抽象类-汽车类

/*** @author         * @version        V1.0  * @Date           2017年11月30日 下午1:54:11 * @Email* @Description:   桥接模式-汽车抽象类 */public abstract class Car {public abstract String run();}

③抽象修正化角色

新司机

/*** @author         * @version        V1.0  * @Date           2017年11月30日 下午2:22:35 * @Email* @Description:   桥接模式-新司机类*/public class NewDriver extends Driver {public NewDriver() {// TODO Auto-generated constructor stub}@Overridepublic void drive() {// TODO Auto-generated method stubSystem.out.println("新手开车喽~~,>>>>" + this.getCar().run());}}

老司机

/*** @author         * @version        V1.0  * @Date           2017年11月30日 下午2:29:21 * @Email* @Description:   老司机类 */public class OldDriver extends Driver {public OldDriver() {// TODO Auto-generated constructor stub}@Overridepublic void drive() {// TODO Auto-generated method stubSystem.out.println("老司机发车喽!! >>>>>" + this.getCar().run());}}

④具体实现化角色

奔驰

/*** @author         * @version        V1.0  * @Date           2017年11月30日 下午2:33:41 * @Email* @Description:   奔驰 */public class Benz extends Car {@Overridepublic String run() {// TODO Auto-generated method stubreturn "Benz Go-->>>>";}}

⑤测试类

/*** @author         * @version        V1.0  * @Date           2017年11月30日 下午2:36:24 * @Email* @Description:   TODO(用一句话描述该文件做什么) */public class BridgeTest {public static void main(String[] args) {Benz benz = new Benz();Audi audi = new Audi();/*新司机*/Driver newBird = new NewDriver();/*老司机*/Driver oldBird = new OldDriver();newBird.setCar(audi);oldBird.setCar(benz);newBird.drive();oldBird.drive();}}

故事三、猪八戒的故事

二师兄的故事

一张图说清楚二师兄的前世今生!

【适用场景】

  • 适合使用在需要跨越多个平台的图形和窗口系统上。
  • 当需要用不同的方式改变接口和实现时,你会发现桥接模式很好用。

【优点】

  • 将实现予以解耦,让它和界面之间不再永久绑定。
  • 抽象和实现可以独立扩展,不会影响到对方。
  • 对于 具体的抽象类 所做的改变,不会影响到客户。

【缺点】

  • 缺点是增加了复杂度

【桥梁模式在Java中的应用】

能用图片说明白的事情,绝不BB。

【结束】

小和尚镇楼

老僧长谈设计模式-10-桥接模式相关推荐

  1. 如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

    如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 标签: 设计模式初涉 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往 ...

  2. java桥接和装饰_设计模式:桥接模式和装饰模式

    原标题:设计模式:桥接模式和装饰模式 一.桥接模式简介 1.基础描述 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是&qu ...

  3. C++设计模式之桥接模式

    这篇文章主要介绍了C++设计模式之桥接模式,本文讲解了什么是桥接模式.为什么要使用桥接模式.什么时候使用桥接模式等内容,需要的朋友可以参考下 问题描述 现在要去画一个图形,图形有长方形.圆形和扇形等等 ...

  4. php设计模式之桥接模式

    php设计模式之桥接模式 一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 其实就是讲不相关的东西通过类(本例中是SendInfo)结合在一起,从而 ...

  5. java 懒加载模式_JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载

    我写的程序员面试系列文章 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Jav ...

  6. linux桥接设置静态,centos6.10 桥接模式下配置静态ip

    centos6.10 桥接模式下配置静态ip主要是修改以下三个地方: /etc/sysconfig/network-scripts/ifcfg-eth0(这个文件名版本不同文件名也不同,可以先cd / ...

  7. 详解设计模式:桥接模式

    桥接模式(Bridge Pattern)也称为桥梁模式.接口模式或者柄体模式,有点像适配器模式,也是 GoF 的 23 种设计模式中的一种结构型设计模式. 桥接模式 是用于把抽象化与实现化解耦,使得二 ...

  8. 设计模式之桥接模式详解

    设计模式之桥接模式详解 文章目录 设计模式之桥接模式详解 一.什么是桥接模式 二.桥接模式的应用场景 三.桥接模式的角色组成 四.桥接模式通用写法示例 五.桥接模式优缺点 一.什么是桥接模式 桥接模式 ...

  9. java 设计模式之桥接模式,策略模式

    java 设计模式之桥接模式,策略模式 1.引出设计模式 相信大家都玩过王者荣耀这款游戏.我们知道现在大概有九十多个英雄且各自技能及背景故事.台词.被动都不一样而且还带着召唤师技能比如实现,惩戒,弱化 ...

最新文章

  1. 谷歌员工论坛自述引程序员羡慕,只招募最优秀的人,薪资福利超棒
  2. GitLab 简易指引(二):GitLab Runner 安装与配置
  3. Linux 设置windows可见的文件夹共享,创建只拥有读权限的共享用户,samba工具安装,“smbpasswd: command not found“问题解决
  4. java usc2短信编码_手机短信PDU编码与解码
  5. 模拟键盘 键盘虚拟代码
  6. 数据分箱1——人工手动分箱
  7. js实现表格任意框选_[R] 在表格中插入图形 - formattable + htmlwidgets
  8. 在某龙芯平台上编译FFMPEG报错:ERROR: xxx not found using pkg-config
  9. 【有限元分析】提高有限元分析计算精度的h方法和p方法
  10. 抖音短视频的营销模式
  11. 每周学一点Egret(17)default.thm.json 文件编译小坑
  12. php7 slowlog,php7: php-fpm seems busy提示
  13. java-net-php-python-jspm点餐管理系统计算机毕业设计程序
  14. 专科出来的计算机学生,月薪两万是否不切实际?
  15. Bootstrap3 与Bootstrap4垂直水平居中
  16. HDU - 2121 Ice_cream’s world II(朱刘算法+虚根)
  17. R语言查找data.frame里面是否包含某些变量。
  18. 聊天宝裁员85% 罗永浩的下一个风口是电子烟
  19. 虚幻引擎之方向轴制作总结
  20. 高效经理的五个常用原则

热门文章

  1. 大商创的开源代码中有很多后门,以方便官方监控系统的使用,官方做的真是无孔不入啊,我找到了下面几种
  2. njupt Keroro侵略地球
  3. BCG 使用之CBCGPProgressDlgCtrl进度条使用
  4. 《The C Programming Language》答案(第一章)
  5. 接口测试面试题及参考答案,就等你来看~
  6. navicat for mysql 导出向导_详解 Navicat 导出向导步骤
  7. 用计算机打女生节快乐,女生节快乐的朋友圈说说
  8. 人类小脑的功能连接组学
  9. 苹果CEO库克:与乔布斯会面5分钟决定加盟苹果
  10. 《四平青年》是部好电影