设计模式之桥接模式

1. 定义

将抽象部分与它的实现部分分离,使它们可以独立地变化

2. 口语化举例

注意,虽然这个设计模式叫“桥接模式”,但是目前大部分资料表述的其实是一种组合 + 动态注入的设计方法,所以看上去有点“名不副实”

这里主要表述的一种组合 + 依赖注入的设计方法,即大部分资料所提及的桥接模式

现在,场景是做一个杯子

杯子就形状而言有圆柱形和方形,就透明度而言有透明和不透明

所以,最原始的生产方式,需要有四份生产工艺,因为有四种杯子

进一步,我们总结出杯子主要有两个维度的差异,即形状与透明度

我们将生产工艺重新设计,分为不同形状(圆柱形和方形)和不同透明度(透明和不透明)的生产方式,还是共四份生产工艺

如果需要圆形透明杯子,只需要将圆形杯子的工艺与透明杯子的工艺组合即可

这样做有问题吗?

有,依旧还是四分生产工艺,生产时还需要组合一遍,分为四种工艺本身就有工作量

好处是什么呢?

假如以后圆形工艺的改变,只需要改变这一份工艺流程即可,而原始方式需要改变所有设计圆形杯子的工艺

假如以后形状有10种不同形状,透明度有十种不同透明度,原始方式就需要有100种生产工艺,而组合模式只需要有20种即可

所以,这种组合的设计方法,在产品组成情况复杂时更有意义,产品组成简单时,意义不大

3. 总结

3.1 设计原则

  • 单一职责原则

    每份工艺只负责一部分

  • 开闭原则

    假如以后工艺的改变,只需要添加对应的工艺

3.2 适用场景

  • 拆分或重组一个具有多重功能的庞杂类
  • 在几个独立维度上扩展一个类
  • 在运行时切换不同实现方法

4. 个人理解

4.1 概念解释

上面说到,大部分资料描述的“桥接模式”名不副实,因为难以看出来什么是“桥”,这个桥又连“接”了什么

笔者认为的桥接模式应该是类似于适配器模式,用一座“桥”,连通了原来互不相通的大地,这个“桥”,不就是某种适配器的意义吗?

那桥接模式和适配器模式的区别是什么呢?

桥接模式更注重的是两者能相互联系、通信,并且往往是在程序设计之初就设定的

适配器模式更注重的格式转换使调用者能直接使用,往往是在已有程序时使用

(笔者认为,区别也不是很大)

4.2 源码示例

Java Access Bridge(访问桥)使某些Java应用程序对于Microsoft Windows上的辅助技术可见(即Java与windows应用程序连接的桥梁)

示意图如下:

image

如图所见,Java Access Bridge在Java程序和Windows程序之间搭建了一个桥梁,使得两者可以相互联系

5. 参考资料

[1] 桥接设计模式 (refactoringguru.cn)

[2] Introduction to Java Access Bridge (oracle.com)

posted @ 2023-11-28 23:25  当时明月在曾照彩云归  阅读(11)  评论(0编辑  收藏  举报