设计模式之桥接模式
1. 定义
将抽象部分与它的实现部分分离,使它们可以独立地变化
2. 口语化举例
注意,虽然这个设计模式叫“桥接模式”,但是目前大部分资料表述的其实是一种组合 + 动态注入的设计方法,所以看上去有点“名不副实”
这里主要表述的一种组合 + 依赖注入的设计方法,即大部分资料所提及的桥接模式
现在,场景是做一个杯子
杯子就形状而言有圆柱形和方形,就透明度而言有透明和不透明
所以,最原始的生产方式,需要有四份生产工艺,因为有四种杯子
进一步,我们总结出杯子主要有两个维度的差异,即形状与透明度
我们将生产工艺重新设计,分为不同形状(圆柱形和方形)和不同透明度(透明和不透明)的生产方式,还是共四份生产工艺
如果需要圆形透明杯子,只需要将圆形杯子的工艺与透明杯子的工艺组合即可
这样做有问题吗?
有,依旧还是四分生产工艺,生产时还需要组合一遍,分为四种工艺本身就有工作量
好处是什么呢?
假如以后圆形工艺的改变,只需要改变这一份工艺流程即可,而原始方式需要改变所有设计圆形杯子的工艺
假如以后形状有10种不同形状,透明度有十种不同透明度,原始方式就需要有100种生产工艺,而组合模式只需要有20种即可
所以,这种组合的设计方法,在产品组成情况复杂时更有意义,产品组成简单时,意义不大
3. 总结
3.1 设计原则
-
单一职责原则
每份工艺只负责一部分
-
开闭原则
假如以后工艺的改变,只需要添加对应的工艺
3.2 适用场景
- 拆分或重组一个具有多重功能的庞杂类
- 在几个独立维度上扩展一个类
- 在运行时切换不同实现方法
4. 个人理解
4.1 概念解释
上面说到,大部分资料描述的“桥接模式”名不副实,因为难以看出来什么是“桥”,这个桥又连“接”了什么
笔者认为的桥接模式应该是类似于适配器模式,用一座“桥”,连通了原来互不相通的大地,这个“桥”,不就是某种适配器的意义吗?
那桥接模式和适配器模式的区别是什么呢?
桥接模式更注重的是两者能相互联系、通信,并且往往是在程序设计之初就设定的
适配器模式更注重的格式转换使调用者能直接使用,往往是在已有程序时使用
(笔者认为,区别也不是很大)
4.2 源码示例
Java Access Bridge(访问桥)使某些Java应用程序对于Microsoft Windows上的辅助技术可见(即Java与windows应用程序连接的桥梁)
示意图如下:
如图所见,Java Access Bridge在Java程序和Windows程序之间搭建了一个桥梁,使得两者可以相互联系