Defines simplified communication between classes to prevent a group of classes from referring explictly to each other. 使用一个中介对象来封装一系列对象交互。中介者使各个对象不需要显式引用,从而使其耦合松散,能够单独改变它们之间的交互。

    • 公开一个统一的接口,系统的不同部分可以通过该接口进行通信。
    • 它促进松耦合的方式在于:确保组件的交互是通过这个中心点进行的,而不是通过显式地引用彼此。
    • Meditator 模式本质上是 Observer 模式的共享目标。它假设该系统中对象或者模块间的订阅发布关系被牺牲掉了,从而维护中心联络点。
    • 缺点:会引入单一故障点,放置于模块间的间接通信会导致性能下降。

    动机:为了尽可能地让对象知道「更少」的外部对象。

    适用性:互相依赖关系复杂的对象结构;或者定义良好的对象却以很复杂的依赖关系进行通信;通信对象过多,难以实现复用。


    代码示例和结构设计:

    MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

    同事向一个中介者发送请求,中介者通过协调同事之间的职能实现转发并处理请求。

    1. class Mediator {}
    2. class DialogDirector extends Mediator {
    3. private widgets;
    4. constructor(widgets) {
    5. super();
    6. this.widgets = widgets;
    7. }
    8. closeDialog() {
    9. this.widgets.map(w => w.hide());
    10. }
    11. disableFontSelector() {
    12. this.widgets.fontSelector && this.widgets.fontSelector.disable();
    13. }
    14. disableFontOptions() {
    15. this.widgets.fontSelector && this.widgets.fontSelector.enable();
    16. this.widgets.fontOptions && this.widgets.fontOptions.disable();
    17. }
    18. }
    19. class FontSelector {}
    20. class FontOptions {}
    21. class OkButton {
    22. onClick() {
    23. this.dialogDirector.disableFontOptions();
    24. this.dialogDirector.closeDialog();
    25. }
    26. }
    27. class CancelButton {
    28. onClick() {
    29. this.dialogDirector.closeDialog();
    30. }
    31. }

    效果:能够减少子类的生成,Colleges 解耦合,简化了对象协议并对对象之间如何进行协作进行了抽象。它同时能够让处理「集中化」,但是也会增大复杂度,导致最终成为一个庞大的「逻辑怪物」。


    协作:Colleges 可以通过 Observer 的形式来向 Meditator 通信。