Java设计模式-内功修炼-结构型-桥接模式
桥接模式
定义
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使他们都可以独立地变化。它是一种对象结构型模式,又称为柄体模式或接口模式。
其存在一条连接两个继承等级结构的桥。
实例讲解
某软件公司欲开发一个跨平台图像浏览系统,要求该系统能够显示JGP, GIF, PNG等多种格式的文件,并且可以在Windows, Linux, Unix等多个操作系统上运行,应该如何设计呢?
初始设计方案:
上述设计方案可以实现所需功能,但是需要分析下其缺点:
- 由于采用了多层继承结构,导致系统中类的个数急剧增加
- 系统扩展麻烦,由于每一个具体类既包含图像文件格式信息,又包含操作系统信息,因此无论是增加新的图像文件格式还是增加新的操作系统,都需要增加大量的具体类
上面的问题其实就涉及到***多维度***的问题,即图片格式是一个维度,不同操作系统又是一个维度,多维度使用多继承来解决是一个非常直接的解决方案,但是其缺点很明显。
所以我们要寻求新的解决方案,想想能否把多继承关系变成组合关系呢?直接上图:
可以看出两种解决方案的区别:第一种使用继承来解决多维度问题,第二种使用组合来解决多维度问题,即将在不同操作系统下的显示组合到Image类里面。虽然多继承和组合都是耦合关系,但是用组合来解决多维度问题更具优点,而且再结合配置文件+反射可以很好的实现符合开闭原则的解决方案。
个人理解
因为使用该设计模式要求程序员能够识别出多维度问题,所以举例说明几个多维度问题。
多维度举例
- 画笔的型号和颜色。
- 显示图像的种类和兼容性。
- 按钮:既能修改样式,又能响应不同事件。
- 一些需要实现多功能的类,都可以理解成多维度问题。
优点分析
- 使用对象组合关系解耦了抽象和实现之间固有的绑定关系,使得抽象和实现沿着各自的维度变化。
- 桥接可以用来替代多层继承问题,多层继承违背了单一指责原则,复用性差,且类的个数非常多。
- 提高了系统的可扩展性,再加上配置文件与反射技术,可以实现符合开闭原则的解决方案。
缺点分析
- 会增加系统的理解和设计难度,要求开发者在设计之初就能针对抽象层进行设计与变成
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如果识别多维度问题也需要一定的经验基类。
适用场景
- 避免建立静态的多继承关系时,使用桥接模式是很好的选择。
- 系统需要对抽象化角色和实现化角色进行动态耦合时。
- 一个类存在多个独立变化的维度,而且各个维度都有可能产生扩展时。