1 解决的问题

运行软件的平台有多种,软件也有多个不同的版本。如果通过继承来实现不同的平台运行不同版本软件的功能,继承不够用。
所以更好的解决是,通过组合的形式来完成。而组合的 UML 图类似桥,所以称为桥接模式。

2 应用场景

  • 1、类存在两个或多个独立变化的维度,而且都需要独立进行扩展;
  • 2、不希望使用继承或因多层继承,导致系统内类个数的急剧增加;
  • 3、需要在某种统一协议下增加更多组件(如支付场景,期望支持微信、支付宝等支付组件,统一协议就是收款、支付、扣款);
  • 4、基于消息驱动的场景(消息行为比较统一,包括发送、接收、处理和回执,但不同 APP 的实现通常各不相同);
  • 5、需要提供平台独立性的应用程序(如不同数据库的 JDBC 驱动程序、硬盘驱动程序等);

3 桥接模式

桥接模式有两种理解方式:

  • 多个维度解耦,让它们能独立开发;(应用场景较少)
  • 用抽象关联取代多层继承,将类间的继承关系转换为动态的对象组合关系

桥接模式中包含两个术语:抽象部分实现部分

  • 抽象部分 (也被称为 接口 ) 是一些实体的高阶控制层,使用 实现部分 中提供的函数,并不关心 实现部分 具体如何实现。如下图中多平台框架+各个平台。
  • 实现部分 (也被称为 平台 )提供多种可用函数接口来供 抽象部分 控制,并进行具体实现。如下图中程序+各版本不同实现方法。

4 模式结构

  • Implementor(实现角色):实现部分的接口,可以理解成定义抽象行为;
  • ConcreteImplementor(具体实现角色):实现抽象行为的具体算法;
  • Abstraction(抽象角色):定义一种抽象分类;
  • Refined Abstraction(扩展抽象角色):继承扩展具体的角色;

  • 抽象部分中进行 channelUp 控制,实现部分提供并实施 getChannelsetChannel 行为。
  • 抽象部分中进行 togglePower 控制,实现部分提供并实施 isEnabledenableddisabled 行为。

5 优缺点

优点

  • 代替多层继承方案,极大减少子类数量;
  • 分离实体与行为,更好的可扩展性;

缺点

  • 增加设计难度:一开始就要针对抽象层进行,正确识别两个独立维度需要一定的经验积累;
  • 增加维护成本:组合和聚合不像继承那样容易找到对象简单的调用关系;
  • 导致性能下降:组合或聚合关系在 OOP 中使用委托的事项方式,调用对象变多,自然影响程序性能;