73 | 中介模式:什么时候用中介模式?什么时候用观察者模式?
王争
该思维导图由 AI 生成,仅供参考
今天,我们来学习 23 种经典设计模式中的最后一个,中介模式。跟前面刚刚讲过的命令模式、解释器模式类似,中介模式也属于不怎么常用的模式,应用场景比较特殊、有限,但是,跟它俩不同的是,中介模式理解起来并不难,代码实现也非常简单,学习难度要小很多。
如果你对中介模式有所了解,你可能会知道,中介模式跟之前讲过的观察者模式有点相似,所以,今天我们还会详细讨论下这两种模式的区别。
话不多说,让我们正式开始今天的学习吧!
中介模式的原理和实现
中介模式的英文翻译是 Mediator Design Pattern。在 GoF 中的《设计模式》一书中,它是这样定义的:
Mediator pattern defines a separate (mediator) object that encapsulates the interaction between a set of objects and the objects delegate their interaction to a mediator object instead of interacting with each other directly.
翻译成中文就是:中介模式定义了一个单独的(中介)对象,来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互,来避免对象之间的直接交互。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
中介模式和观察者模式是常见的设计模式,旨在解耦对象之间的交互关系。中介模式通过引入中介对象将多对多的交互关系转换为一对多,降低代码复杂度。观察者模式通过订阅-发布机制处理单向的交互关系。中介模式适用于交互复杂、维护成本高的场景,可实现参与者操作的顺序控制;观察者模式适用于有条理的交互关系。在实际应用中,需根据具体交互场景和需求进行权衡和选择。文章还讨论了EventBus框架,提出了它可能更像中介模式的实现框架的观点。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》,新⼈⾸单¥98
《设计模式之美》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(41)
- 最新
- 精选
- 守拙我按照老师的demo写了一遍中介模式的dialog实现, 发现不就是Dialog impl OnClickListener嘛... 关于Observer与Mediator的区别 Observer定义了一对多(one-to-many)的依赖关系, Mediator封装了多个对象互相之间的交互方式. Oberver定义了单向的订阅关系, Mediator通过引入中间件的方式解决多个对象之间混乱的依赖关系与通信方式. 一个可爱的小栗子: Observer不能做什么: 1. 观察者: hey订阅号, 你到底什么时候更新? 2. 观察者: 订阅号你到底什么时候更新? 我怎么没收到更新? 3. 观察者: 我知道订阅号更新了!(假话) Observer能做什么: 1. 观察者乖乖坐等更新; 2. 一段时间后... 3. 订阅号: hey我更新了, 小崽子们! Mediator不能做什么: 1. 乘客1: hey taxi1, 带我去xx(不会得到任何回应) 2. 乘客2: hey taxi2, 带我去xx(不会得到任何回应) 3. 乘客1: hey taxi2, 带我去xx(不会得到任何回应) Mediator能做什么: 1. 乘客1: dd车辆调度中心, 我要去xx, 请派车接我!(司机正在赶来) 2. 乘客2: dd车辆调度中心, 我要去xx, 请派优享来接我!(优享司机马上就到!) 课堂讨论: EventBus基于观察者模式实现, 并不符合中介模式的定义. 中介模式封装一组对象间交互, 将这组对象间的交互委派给中介对象交互. EventBus仅负责发布消息, 并不处理发布者/订阅者的任何交互.
作者回复: 👍
2020-04-20888 - iLeGeND感觉23中设计模式之间本身就有某种耦合 好多不易区分
作者回复: 是的 你感觉没错
2020-04-20523 - Demon.Lee老师的这个例子,我还是没看明白哪里体现了“多个对象之间交互” --> "多个对象之间通过中介交互" 的变化。比如之前是regButton,loginButton,Selection三者之间是怎么交互的,我没看出来。然后又是如何把这三个对象的相互调用,改成了通过中介类交互的,我也没看明白。我去查阅了其他资料,发现什么虚拟聊天室什么的代码就体现了上面这一点:用户A发消息给用户B是直接交互,改造之后是,用户A发消息给中介,中介再把消息转给消息B。有小伙伴们理解了么,能否分享下。
作者回复: 不是做前端的吧😂 聊天室的看懂就好了 不过聊天室的那个就存粹是拼凑出来的例子 真实场景里 不可能那么实现
2020-04-2044 - 小晏子eventbus更属于观察者模式,首先eventbus中不处理业务逻辑,只提供了对象与对象之间交互的管道;而中介模式为了解决多个对象之间交互的问题,将多个对象的行为封装到一起(中介),然后任意对象和这个中介交互,中介中包含了具体业务逻辑。其次从其实现的思路上,EventBus 和观察者都需要定义 Observer,并且通过 register() 函数注册 Observer,也都需要通过调用某个函数(比如,EventBus 中的 post() 函数)来给 Observer 发送消息。而且eventbus并没有中介模式大而臃肿的上帝类问题。2020-04-202149
- 大头想到了现在流行的微服务,注册中心可以理解为广义的中介模式,防止各个服务间错综复杂的调用2020-04-20652
- 写代码的中介模式注重于协调,而不是通讯。既然要协调,那么中介模式就得依赖于各个参与者,知道他们的功能。而观察者不需要知道被观察者的功能,只负责把消息送到就行。2020-09-1416
- 李小四设计模式_73: # 作业: 个人认为还是观察者模式,当然,引入消息队列的观察者模式可以理解为中介模式的一种,它的业务调用更有规律,它不要求被调用者的顺序。 # 感想: 中介模式看下来,感觉是要带领我们回到面向过程的老路,就文中所述的“上帝类”,有了这个中介,依然在维护复杂的调用关系。2020-04-2016
- xk_EventBus不处理业务逻辑,只是单向传递消息,所以是观察者模式。 中介模式,可以处理业务逻辑,而且双向传递信息的。2020-05-044
- testeventbus解决的是消息的发布订阅等,跟具体的业务没关系,所以是观察者模式2020-04-204
- 黄林晴打卡 在实际的开发中 UI 控件变化那种感觉不太适合中介模式 因为要把所有的控件view 都传到中介类中才可以获取到输入的内容 感觉比较奇怪,就像只是把某个方法单独提取到一个类中一样2020-04-2023
收起评论