Defines simplified communication between classes to prevent a group of classes from referring explictly to each other. 使用一个中介对象来封装一系列对象交互。中介者使各个对象不需要显式引用,从而使其耦合松散,能够单独改变它们之间的交互。
- 公开一个统一的接口,系统的不同部分可以通过该接口进行通信。
- 它促进松耦合的方式在于:确保组件的交互是通过这个中心点进行的,而不是通过显式地引用彼此。
- Meditator 模式本质上是 Observer 模式的共享目标。它假设该系统中对象或者模块间的订阅发布关系被牺牲掉了,从而维护中心联络点。
- 缺点:会引入单一故障点,放置于模块间的间接通信会导致性能下降。
动机:为了尽可能地让对象知道「更少」的外部对象。
适用性:互相依赖关系复杂的对象结构;或者定义良好的对象却以很复杂的依赖关系进行通信;通信对象过多,难以实现复用。
代码示例和结构设计:
MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
同事向一个中介者发送请求,中介者通过协调同事之间的职能实现转发并处理请求。
class Mediator {}class DialogDirector extends Mediator {private widgets;constructor(widgets) {super();this.widgets = widgets;}closeDialog() {this.widgets.map(w => w.hide());}disableFontSelector() {this.widgets.fontSelector && this.widgets.fontSelector.disable();}disableFontOptions() {this.widgets.fontSelector && this.widgets.fontSelector.enable();this.widgets.fontOptions && this.widgets.fontOptions.disable();}}class FontSelector {}class FontOptions {}class OkButton {onClick() {this.dialogDirector.disableFontOptions();this.dialogDirector.closeDialog();}}class CancelButton {onClick() {this.dialogDirector.closeDialog();}}
效果:能够减少子类的生成,Colleges 解耦合,简化了对象协议并对对象之间如何进行协作进行了抽象。它同时能够让处理「集中化」,但是也会增大复杂度,导致最终成为一个庞大的「逻辑怪物」。
协作:Colleges 可以通过 Observer 的形式来向 Meditator 通信。
