引入
- 面向对象应用程序由一些互动的对象组成
- 当参与对象数目较少时,对象之间可以直接交互
我们经常这样做,例如
- 在策略模式和状态模式里面,Context类的对象与Strategy层次类对象的耦合是双向的
- 在状态模式里面,Context类的对象与State层次类的对象之间的耦合是双向的
在**OO**程序中,很多的对象互相直接交互导致混乱
解决方案: 重新设计为星形、拓扑
示例:
为什么中介者类必须拥有**register**方法
- 中介类必须知道所有具体参与的同事,因此该类需要一个register方法
- register方法可用于让中介类保留所有参与对象
为什么每个**Colleague**子类都必须保持中介者类的引用
- 每个参与类必须保留中介类的引用,以便它可以调用中介类中的方法来执行某些操作。
Mediator:中介者的接口。
ConcreteMediator**:具体的中介者,可以有多个具体的中介者。
Colleague**:参与者对象接口
Colleague1**, Colleague2:具体的参与者。可以有多个具体的参与者。
用途**
- 我们可以使用中介模式来减少对象之间的直接调用
- Mediator模式建议将所有对象交互细节抽象到一个单独的类中,即Mediator
- 维持每个参与者类的引用
- 提供调用参与对象的方法
典型交互
- 任何两个不同对象之间的交互通过中介类路由。
- 所有对象将其消息发送到中介器(调用中介器的方法)
- 然后中介器将消息发送到适当的对象以实现应用程序的需求(在中介器中,然后每隔一个对象调用方法)。
优点
- 参与者类复用性变得更好
- 参与者对象之间的关系可以由中介者子类对象调节
- 有利于参与者类的单元测试
- 有利于参与者类的修改
缺点
- 使用中介可能会影响性能
实例
酒店航空旅游信息系统
中介器模式的实现细节
- 编写**Mediator 类**
- 编写一个中介类,并声明私有变量,这些变量具有参与中介模式设计的所有对象的类型
- 编写 registration 方法
- 在mediator类中,编写所有注册方法来注册所有参与的对象。例如,参与的对象类型应该分别包含在注册方法的参数中
- 在每个注册方法中,将从参数传递的对象分配给相应的私有成员。
通过程序认识和了解中介者模式