Java设计模式-内功修炼-结构型-桥接模式

桥接模式

定义

桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使他们都可以独立地变化。它是一种对象结构型模式,又称为柄体模式或接口模式。

其存在一条连接两个继承等级结构的桥。

实例讲解

某软件公司欲开发一个跨平台图像浏览系统,要求该系统能够显示JGP, GIF, PNG等多种格式的文件,并且可以在Windows, Linux, Unix等多个操作系统上运行,应该如何设计呢?

初始设计方案:
Java设计模式-内功修炼-结构型-桥接模式
上述设计方案可以实现所需功能,但是需要分析下其缺点:

  • 由于采用了多层继承结构,导致系统中类的个数急剧增加
  • 系统扩展麻烦,由于每一个具体类既包含图像文件格式信息,又包含操作系统信息,因此无论是增加新的图像文件格式还是增加新的操作系统,都需要增加大量的具体类

上面的问题其实就涉及到***多维度***的问题,即图片格式是一个维度,不同操作系统又是一个维度,多维度使用多继承来解决是一个非常直接的解决方案,但是其缺点很明显。

所以我们要寻求新的解决方案,想想能否把多继承关系变成组合关系呢?直接上图:
Java设计模式-内功修炼-结构型-桥接模式
可以看出两种解决方案的区别:第一种使用继承来解决多维度问题,第二种使用组合来解决多维度问题,即将在不同操作系统下的显示组合到Image类里面。虽然多继承和组合都是耦合关系,但是用组合来解决多维度问题更具优点,而且再结合配置文件+反射可以很好的实现符合开闭原则的解决方案。

个人理解

因为使用该设计模式要求程序员能够识别出多维度问题,所以举例说明几个多维度问题。

多维度举例

  1. 画笔的型号和颜色。
  2. 显示图像的种类和兼容性。
  3. 按钮:既能修改样式,又能响应不同事件。
  4. 一些需要实现多功能的类,都可以理解成多维度问题。

优点分析

  • 使用对象组合关系解耦了抽象和实现之间固有的绑定关系,使得抽象和实现沿着各自的维度变化。
  • 桥接可以用来替代多层继承问题,多层继承违背了单一指责原则,复用性差,且类的个数非常多。
  • 提高了系统的可扩展性,再加上配置文件与反射技术,可以实现符合开闭原则的解决方案。

缺点分析

  • 会增加系统的理解和设计难度,要求开发者在设计之初就能针对抽象层进行设计与变成
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如果识别多维度问题也需要一定的经验基类。

适用场景

  • 避免建立静态的多继承关系时,使用桥接模式是很好的选择。
  • 系统需要对抽象化角色和实现化角色进行动态耦合时。
  • 一个类存在多个独立变化的维度,而且各个维度都有可能产生扩展时。