桥接模式 Bridge
动机(Motivation)
- 因为某些类型的固有的实现逻辑,使得它们具备两个变化的维度,乃至多个维度的变化。
- 如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型能够轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?
模式定义
将抽象部分(业务功能)与实现部分(平台实现)分离,使它们均可以独立地变化。——《设计模式》GoFjava
结构(Structure)

要点总结
- Bridge 模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现能够沿着各自的维度来变化。所谓抽象和实现沿着各自维度的变化,即“子类化”它们。
- Bridge 模式有时候相似于多继承方案,可是多继承方案每每违背单一职责原则(即一个类只有一个变化的缘由),复用性比较差。Bridge 模式是比多继承方案更好的解决方法。
- Bridge 模式的应用通常在“两个很是强的变化维度”,有时一个类也有多于两个的变化维度,这时可使用 Bridge 的扩展模式。
代码实现
模拟场景:电脑城销售电脑

分析该场景,电脑存在两个方向的变化:
- 电脑类型,如台式机、笔记本、Pad、服务器等
- 电脑品牌,如联想、戴尔、神州、苹果等
实现方式
-
使用继承,实现类图以下:git

使用继承,不管是新增一个类型仍是新增一个品牌,都将引发另外一个维度的变化,这显然不是咱们想要的。
-
使用桥接模式,实现类图以下:github

能够看出,使用桥接模式后,不管新增一个类型仍是新增一个品牌,都不会影响到另一个维度的变化,并且经过组合也明显下降了子类的膨胀。
示例代码
桥接模式-示例代码设计模式