文章目录

  • 23种设计模式——桥接模式
    • 1、桥接模式概述
    • 2、桥接模式结构
    • 3、桥接模式的实现
    • 4、桥接模式的注意事项和细节

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

1、桥接模式概述

桥接模式介绍

桥接(Bridge)模式是指:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

桥接模式是一种结构性模式。

桥接模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。

桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。

桥接模式的优缺点

优点:

  • 抽象与实现分离,扩展能力强
  • 符合开闭原则
  • 符合合成复用原则
  • 其实现细节对客户透明

缺点:

  • 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难

2、桥接模式结构

桥接模式的结构

桥接(Bridge)模式包含以下主要角色。

  1. 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化(Implementor)角色的引用。Abstraction 充当桥接类。
  2. 扩展抽象化(Refined Abstraction)角色:是抽象化(Abstraction)角色的子类,实现父类中的业务方法,并通过组合关系调用实现化(Implementor)角色中的业务方法。
  3. 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化(Refined Abstraction)角色调用。
  4. 具体实现化(Concrete Implementor)角色:给出实现化(Implementor)角色接口的具体实现。

桥接模式的结构图

3、桥接模式的实现

定义实现化角色的接口:

public interface Brand {void open();void close();void call();
}

定义具体实现化角色:给出实现化(Implementor)角色接口的具体实现。

定义具体实现化角色1:

public class XiaoMi implements Brand{@Overridepublic void open() {System.out.println("小米手机开机");}@Overridepublic void close() {System.out.println("小米手机关机");}@Overridepublic void call() {System.out.println("小米手机打电话");}
}

定义具体实现化角色2:

public class Vivo implements Brand{@Overridepublic void open() {System.out.println("Vivo手机开机");}@Overridepublic void close() {System.out.println("Vivo手机关机");}@Overridepublic void call() {System.out.println("Vivo手机打电话");}
}

定义抽象化(Abstraction)角色:里面包含了对实现化角色的接口的引用

public abstract class Phone {//组合Brand接口private Brand brand;public Phone(Brand brand){super();this.brand = brand;}//调用接口里的方法,当该类的子类调用该类的方法时就会调用到接口里的方法protected void open(){brand.open();}protected void close(){brand.close();}protected void call(){brand.call();}
}

定义扩展抽象化(Refined Abstraction)角色:是抽象化(Abstraction)角色的子类,实现父类中的业务方法,并通过组合关系调用实现化(Implementor)角色中的业务方法。

public class FoldedPhone extends Phone{public FoldedPhone(Brand brand){super(brand);//调用父类的构造器初始化}public void open(){super.open();//通过组合关系调用实现化(Implementor)角色中的业务方法System.out.println("折叠样式手机");}public void close(){super.close();System.out.println("折叠样式手机");}public void call(){super.call();System.out.println("折叠样式手机");}
}

定义客户端测试桥接模式:

public class Client {public static void main(String[] args) {FoldedPhone phone = new FoldedPhone(new XiaoMi());phone.open();phone.close();phone.call();System.out.println();FoldedPhone phone1 = new FoldedPhone(new Vivo());phone1.open();phone1.close();phone1.call();}
}

当我们要增加一个扩展抽象化(Refined Abstraction)角色,只需继承抽象化(Abstraction)角色(桥接类)即可

public class UpRightPhone extends Phone{public UpRightPhone(Brand brand){super(brand);}public void open(){super.open();//调用父类方法System.out.println("直立样式手机");}public void close(){super.close();System.out.println("直立样式手机");}public void call(){super.call();System.out.println("直立样式手机");}}

增加一个扩展抽象化(Refined Abstraction)角色后,再次测试桥接模式:在原来测试代码上增加

    UpRightPhone phone2 = new UpRightPhone(new XiaoMi());phone2.open();phone2.close();phone2.call();

4、桥接模式的注意事项和细节

  1. 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。

  2. 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。

  3. 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。

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

  5. 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景。

桥接模式的应用场景

当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。

桥接模式通常适用于以下场景:

  1. 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  2. 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  3. 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

桥接模式的一个常见使用场景就是替换继承。我们知道,继承拥有很多优点,比如,抽象、封装、多态等,父类封装共性,子类实现特性。继承可以很好的实现代码复用(封装)的功能,但这也是继承的一大缺点。

因为父类拥有的方法,子类也会继承得到,无论子类需不需要,这说明继承具备强侵入性(父类代码侵入子类),同时会导致子类臃肿。因此,在设计模式中,有一个原则为优先使用组合/聚合,而不是继承。

23种设计模式——桥接模式相关推荐

  1. 23种设计模式----------代理模式(一)

    代理模式也叫委托模式. 代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问.就是,代理类 代理 被代理类,来执行被代理类里的方法. 一般情况下,代理模式化有三个角色. 1,抽象的主题类(或者 ...

  2. 23种设计模式-工厂模式

    23种设计模式-工厂模式 前言: [我们为什么需要使用工厂模式?] /*** 在使用工厂模式之前,我们要创建 实现了相同接口的对象 都需要直接new(),如下* */@Testpublic void ...

  3. 23种设计模式——工厂模式

    文章目录 23种设计模式--工厂模式 1.工厂模式概述 2.简单工厂模式 2.1.简单工厂模式的优缺点 2.2.简单工厂模式的结构 2.3.简单工厂模式的实现 3.工厂方法模式 3.1.工厂方法模式的 ...

  4. 23种设计模式常用模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过 ...

  5. SSM源码分析之23种设计模式(策略模式和模板模式)

    23种设计模式之策略模式和模板模式 目录 策略模式使用场景 策略模式实现 模板模式 目录 策略模式使用场景 策略模式:根据用户的需求处理数据时候需要对算法做出选择,固定的一些算法(不再发生变化的算法) ...

  6. 23种设计模式----模板方法模式----行为模式

    模板方法模式 1.模板方法模式是什么 2.模板方法的组成 3.模板方法中不同的类的行为 4.例子 4.1 例子的背景 4.2模板类--父亲寻找继承人的方式 4.3实现类----孩子类 4.4测试类-- ...

  7. 23种设计模式----原型模式----创建型模式

    原型模式 1.1什么是原型模式 1.2为什么要使用原型模式 2.原型模式的解释 3.例子 3.1例子将要实现的目标 3.2例子设计 3.3原型类 3.4具体实现的3个原型实例类 3.5管理类 3.6工 ...

  8. 精讲23种设计模式-策略模式~聚合短信服务和聚合支付服务

    文章目录 一.设计模式 1. 为什么需要使用设计模式 2. 设计模式的分类 3. 什么是策略模式 4. 为什么叫做策略模式 5. 策略模式优缺点 6. 策略模式应用场景 7. Spring框架中使用的 ...

  9. 23种设计模式-命令模式《三国大阅兵》

    对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧! 在面向对象程式设计的范畴中,命令模式(Command Pattern)是一 ...

最新文章

  1. “脑补”的科学依据:眼前的黑不是黑,靠得是你的大脑
  2. Java 7并发编程实战手册
  3. IE7一样可以轻易重装
  4. 栈对象、堆对象、静态对象的比较
  5. ibatisnet 学习手记(1)
  6. 稳定高效大型系统架构---集群中间件开发
  7. 【转载】也有很多的例子飞鸽传书
  8. R语言学习笔记-Error in ts(x):对象不是矩阵问题解决
  9. python操作cad的模块_怎么把freecad当python模块来用
  10. 使用Rational Quality Manager 4.0.1更有效地管理测试数据
  11. nginx的cgi模块
  12. Spark SQL的自定义函数UDF
  13. css中“~”(波浪号)、“,”(逗号)、 “ + ”(加号)和 “ ”(大于号)是什么意思?
  14. SSM整合(Spring+SpringMVC+MyBatis)
  15. 启动springboot报错:程序包org.springframework.boot不存在
  16. 死链检查工具 Xenu
  17. r语言做绘制精美pcoa图_三分钟绘制一张优美的PCoA图 | 云平台
  18. 联想拯救者 独显模式下亮度无法调节 解决方法记录
  19. 云直播SDK核心功能对比|腾讯云、阿里云、声网、即构等SDK厂商对比
  20. 经验分享:一套完整的硬件电路设计该怎么做?

热门文章

  1. ntpdate时间同步
  2. echarts 折线图小圆点修改为实心,折线图下方半透明效果
  3. x210ii DM9000驱动调试成功-基于x210ii/s5pv210开发板
  4. 如何制作一张户外地图
  5. 如何在STS正确导入项目
  6. 用友U8新装的服务器客户端不能连接问题的解决办法
  7. 记录一下vscode的IDEA快捷键设置
  8. php引用公有类方法_PHP 利用反射(ReflectionClass)调用其他类的方法 | 剑花烟雨江南...
  9. 国标GH5188高温合金
  10. STL-algorithm