设计模式 - 桥接模式
一、定义
1. 桥接模式(Bridge Pattern)是GoF提出的23种设计模式中的一种,属于结构模式。
2. 桥接模式实现了抽象化与实现化的脱耦,他们两个互相独立,不会影响到对方。
3. 桥接模式是使相同模式的两种事物连接起来,并允许各自独立变化。
4. 将依赖具体实现修改为依赖抽象。
5. 抽象类和实现类之间使用组合/聚合而不是继承关系。
二、基本角色
1. 抽象化角色:用于进行连接的发起方。
2. 实现化角色:用于进行连接的接收方。
桥接模式的基本关系如下图。
三、通俗例子
1. 我们日常使用的空调和万能遥控器就是一个桥接模式的例子。
2. 早期的空调和原产遥控器是一种强耦合的关系,一个品牌某型号的空调和原产遥控器是一一对应的,也就是说,一个原产遥控器只能作用于其对应品牌型号的空调,对其它空调是无效的。当家里安装了多台不同品牌型号的空调时,各个原产遥控器就无法混用了。而且原产遥控器和其空调的强耦合关系,使其不能独立变化,每次变化都会影响对方。
3. 为了解决这个麻烦,出现了万能空调遥控器。你现在可以用任意品牌的万能遥控器操作任意一台空调了。
4. 这里的万能遥控器就是一个抽象化角色,空调就是实现化角色,实现了脱耦。
万能遥控器可以独立变化,增加任意的按钮,而不会影响到空调(不支持的功能就没作用)。
空调也可以独立变化,增加任意的功能,而不会影响到遥控器(某个遥控器无法使用该空调的某个功能)。
具体的某个万能遥控器和空调之间,可以任意组合。
四、简单例子
1. 根据桥接模式所要求的基本角色,我们可以建立一个最简单的例子,如下图所示的JAVA类
2. 桥接的方向是抽象化角色->实现化角色,在这个例子里就是:形状->颜色。
所有这里定义的形状抽象类,持有颜色抽象类,并主动调用颜色方法。
3. 而定义的颜色抽象类,则被动接收形状。
4. 使用:现在再进行任意组合,就比较清晰了。
五、总结
1. 优点
降低了沿着两个或多个维度扩展时的复杂度,防止类的过度膨胀。
解除了两个或多个维度之间的耦合,使它们沿着各自方向变化而不互相影响
2. 适用场景
当一个对象有多个变化因素时,可以考虑使用桥接模式,通过抽象这些变化因素,将依赖具体实现修改为依赖抽象。
当我们期望一个对象的多个变化因素可以动态变化,而且不影响客户端的程序使用时。
如果使用继承的实现方案,会导致产生很多子类,任何一个变化因素都需要产生多个类来完成,就要考虑桥接模式。