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
通信。