举个例子

不用桥接模式

考虑一个需求,绘制矩形,圆形和三角形,那我们需要三个具体的实现类。
image.png
如果新的需求是,每个形状需要四种不同的颜色:红、蓝、黄、绿。那么我们可能的解决方案是,以上面的三个类为父类,分别定义子类继承这三个类,那么就得到4 * 3 = 12个类:

  • 红色矩形,蓝色矩形,黄色矩形,绿色矩形
  • 红色圆形,蓝色圆形,黄色圆形,绿色圆形
  • 红色三角形,蓝色三角形,黄色三角形,绿色三角形

那么如果需求继续变化,比如又要能绘制黑色的形状,那么就又需要添加三个类。如此就会导致类爆炸,因为是n * m的数量级,比如20个形状和20个颜色,就是400个类。

用桥接模式

首先,将颜色分离出去,而不是采用继承的方式让它和形状杂糅在一起。
image.png
然后在每个形状类中,桥接IColor接口:
image.pngimage.png
使用时,将想要的颜色对象传入到形状中去即可:
image.png
通过桥接模式,我们只需要3 + 4 = 7个颜色类,种类越多,桥接模式的优势越明显。

官方定义

将抽象部分和实现部分分离,使他们可以独立的变化。

在上面的例子中,抽象部分指的是父类,即形状类;
实现部分指的是不同子类的区别,将子类的区别方式,即颜色,分离成接口,通过组合的方式桥接颜色和形状。

主要用于两个或多个同等级的接口。