设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
120453 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

49 | 桥接模式:如何实现支持不同类型和渠道的消息推送系统?

上一节课我们学习了第一种结构型模式:代理模式。它在不改变原始类(或者叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。代理模式在平时的开发经常被用到,常用在业务系统中开发一些非功能性需求,比如:监控、统计、鉴权、限流、事务、幂等、日志。
今天,我们再学习另外一种结构型模式:桥接模式。桥接模式的代码实现非常简单,但是理解起来稍微有点难度,并且应用场景也比较局限,所以,相对于代理模式来说,桥接模式在实际的项目中并没有那么常用,你只需要简单了解,见到能认识就可以,并不是我们学习的重点。
话不多说,让我们正式开始今天的学习吧!

桥接模式的原理解析

桥接模式,也叫作桥梁模式,英文是 Bridge Design Pattern。这个模式可以说是 23 种设计模式中最难理解的模式之一了。我查阅了比较多的书籍和资料之后发现,对于这个模式有两种不同的理解方式。
当然,这其中“最纯正”的理解方式,当属 GoF 的《设计模式》一书中对桥接模式的定义。毕竟,这 23 种经典的设计模式,最初就是由这本书总结出来的。在 GoF 的《设计模式》一书中,桥接模式是这么定义的:“Decouple an abstraction from its implementation so that the two can vary independently。”翻译成中文就是:“将抽象和实现解耦,让它们可以独立变化。”
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(171)

  • 最新
  • 精选
  • zhengyu.nie
    举个很简单的例子,现在有两个纬度 Car 车 (奔驰、宝马、奥迪等) Transmission 档位类型 (自动挡、手动挡、手自一体等) 按照继承的设计模式,Car是一个Abstract基类,假设有M个车品牌,N个档位一共要写M*N个类去描述所有车和档位的结合。 而当我们使用桥接模式的话,我首先new一个具体的Car(如奔驰),再new一个具体的Transmission(比如自动档)。然后奔驰.set(手动档)就可以了。 那么这种模式只有M+N个类就可以描述所有类型,这就是M*N的继承类爆炸简化成了M+N组合。 public abstract class AbstractCar { protected Transmission gear; public abstract void run(); public void setTransmission(Transmission gear) { this.gear = gear; } } 所以桥接模式解决的应该是继承爆炸问题。 可以看作是两个abstract组合在一起,独立去拓展,在运行之前将两个具体实现组合到一起。 遵循以下原则 ·依赖倒置原则 ·迪米特法则 ·里氏替换原则 ·接口隔离原则 ·单一职责原则 ·开闭原则

    作者回复: 是我说的第二种理解方式

    27
    237
  • 蹦哒
    老师请问是否可以这样理解:代理模式是一个类与另一个类的组合,桥接模式是一组类和另外一组类的组合

    作者回复: 有点那个意思~👍

    3
    94
  • 乾坤瞬间
    回过头再看,总结一下 桥接在网络osi模型中的链路层上代表一种设备,这种设备通过学习连接到此设备上的计算机macid来识别并原封不动的转发数据包。在软件上抽象层类似于桥接设备,具体实现类似于连接到抽象层的设备一样,如果用户通过抽象的桥接层发送消息,那么就要通过macid寻找具体设备,而这个macid在桥接模式中类似于抽象层定义的需要由具体层实现的方法的集合。 同时也要注意一下物理链路寻找macid的过程是在第一次的时候就动态绑定指定计算机macid到桥接器中,换句话说,可以通过在创建类或者初始化类的时候直接就绑定了对象。这个过程可以通过static方法块和初始化函数中创建

    作者回复: 嗯嗯 桥接不好理解

  • 风不会停息 。
    个人理解,这个模式,跟组合模式很像,两者的区别是什么呢?

    作者回复: 组合模式跟他完全是两回事,你可以先看下组合模式再说。它有点类似“组合”关系。

    2
  • 业余爱好者
    桥接看着就像是面向接口编程这一原则的原旨---将实现与抽象分离。让我迷惑的是,让两者独立变化的说法,接口不是应该稳定吗,为什么要变化? 多个纬度独立变化那个解释倒是比较容易理解。文中举的警报的例子很贴切。紧急程度和警报的方式可以是两个不同的纬度。可以有不同的组合方式。这与slf4j这一日志门面的设计有异曲同工之妙。slf4j其中有三个核心概念,logger,appender和encoder。分别指这个日志记录器负责哪个类的日志,日志打印到哪里以及日志打印的格式。三个纬度上可以有不同的实现,使用者可以在每一纬度上定义多个实现,配置文件中将各个纬度的某一个实现组合在一起就ok了。 行文至此,开头的那个问题也有了答案。一句话就是,桥接就是面向接口编程的集大成者。面向接口编程只是说在系统的某一个功能上将接口和实现解藕,而桥接是详细的分析系统功能,将各个独立的纬度都抽象出来,使用时按需组合。
    12
    205
  • 下雨天
    课后题:可以考虑使用建造者模式来重构!参见46讲中 建造者使用场景: 1.构造方法必填属性很多,需要检验 2.类属性之间有依赖关系或者约束条件 3.创建不可变对象(此题刚好符合这种场景)
    11
    83
  • 松花皮蛋me
    这个模式和策略模式的区别是?
    14
    31
  • 忆水寒
    参数不多的情况可以在构造函数初始化,如果参数较多 就可以使用建造者模式初始化。
    21
  • 李朝辉
    一点思考:如果notification类针对一次告警,需要同时在微信、电话、邮件上发送通知,当前的Notification类定义就没办法满足条件了,可以将组合的MsgSender变成一个list或者set,将不同渠道的sender注册进去,这样,就可以在调用notify的时候,将list或set内的sender,都调用一遍send
    3
    20
  • 攻城拔寨
    我觉得桥接模式解释成: 一个类存在不同纬度的变化,可以通过组合的方式,让它们独自扩展。 栗子:白色圆形,白色正方形,黑色圆形,黑色正方形。 抽象成 颜色 跟 形状 两个纬度去搞,就是桥接模式啦。 至于 jdbc 的,我水平有限啊,还是理解不了~
    8
    17
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部