Mediator(中介者)模式
如果一个系统的各个组件之间看起来有太多的直接关系,也许是时候需要一个中心控制点了,以便各个组件可以通过这个中心控制点进行通信。
Mediator 模式促进松散耦合的方式是:确保组件的交互是通过这个中心点来处理的,而不是通过显示地引用彼此,这个种模式可以帮助我们解耦系统并提高组件的可重用性。
基本实现
1 | var mediator = (function() { |
高级实现
更高级的代码实现可以浏览 Jack Lawson 的优秀 Mediator.js 的简洁版
首先让我们来实现订阅者的概念,可以考虑一个 Mediator 的 topic 注册实例。
通过生成对象实例,之后我们可以很容易地更新订阅者,而不需要注销并重新注册他们。订阅者可以写成构造函数。该函数接受三个参数:一个可被调用的函数 fn、一个 options 对象和一个 context
1 | // 将context上下文传递给订阅者,默认上下文是window对象 |
Mediator 中的 topic 持有一组回调函数和子 topic 列表,一旦 Mediator.Publish 方法在 Mediator 实例上被调用时,这些回调函数就会被触发。它还包含用于操作数据列表的方法。
一个完整的示例
1 | <h1>chat</h1> |
1 | // 模拟Topic |
优点和缺点
优点:
它能够将系统中对象或组件之间所需要的通信渠道从多对多减少到多对一。
缺点:
它会引入单一故障点。将Mediator放置于模块之间会导致性能下降,因为它们总是间接地进行通信。由于松耦合的性质,很难通过关注广播来确定一个系统如何作出反应。
中介者(Mediator)和 观察者(Observer)
在Observer模式中,不存在封装约束单一对象,Observer和Subject必须合作才能维持约束。Communicate(通信)模式由观察者和目标互联的方式所决定:单一目标通常有很多观察者,有时一个目标的观察者是另一个观察者的目标。
Mediator和Observer都能促进松耦合:然而,Mediator模式通过限制对象严格通过Mediator进行通信来实现这一目的。Observer模式创建观察者对象,观察者对象向订阅它们的对象发布其感兴趣的事件。
中介者(Mediator)与外观(Facade)
Mediator模块在它被模块显示引用的地方汇集这些模块之间的通信。从某种意义说,这是多方向的。另一方面,Facade模式仅是为模块或系统定义了一个较简单的接口,而没有添加任何额外的功能。系统中的其他模块不会直接关联外观,所以可以被视为单向的。