引入

    • 面向对象应用程序由一些互动的对象组成
    • 当参与对象数目较少时,对象之间可以直接交互

    我们经常这样做,例如

    • 在策略模式和状态模式里面,Context类的对象与Strategy层次类对象的耦合是双向的
    • 在状态模式里面,Context类的对象与State层次类的对象之间的耦合是双向的

    在**OO**程序中,很多的对象互相直接交互导致混乱
    解决方案: 重新设计为星形、拓扑
    示例:
    image.png
    为什么中介者类必须拥有**register**方法

    • 中介类必须知道所有具体参与的同事,因此该类需要一个register方法
    • register方法可用于让中介类保留所有参与对象

    为什么每个**Colleague**子类都必须保持中介者类的引用

    • 每个参与类必须保留中介类的引用,以便它可以调用中介类中的方法来执行某些操作。

    Mediator:中介者的接口。
    ConcreteMediator**具体的中介者,可以有多个具体的中介者。
    Colleague**:参与者对象接口
    Colleague1**, Colleague2:具体的参与者。可以有多个具体的参与者。
    用途**

    • 我们可以使用中介模式来减少对象之间的直接调用
    • Mediator模式建议将所有对象交互细节抽象到一个单独的类中,即Mediator
      • 维持每个参与者类的引用
      • 提供调用参与对象的方法

    典型交互

    • 任何两个不同对象之间的交互通过中介类路由。
      • 所有对象将其消息发送到中介器(调用中介器的方法)
      • 然后中介器将消息发送到适当的对象以实现应用程序的需求(在中介器中,然后每隔一个对象调用方法)。

    优点

    • 参与者类复用性变得更好
    • 参与者对象之间的关系可以由中介者子类对象调节
    • 有利于参与者类的单元测试
    • 有利于参与者类的修改

    缺点

    • 使用中介可能会影响性能

    实例
    酒店航空旅游信息系统
    image.png
    image.png
    image.png
    中介器模式的实现细节

    • 编写**Mediator 类**
      • 编写一个中介类,并声明私有变量,这些变量具有参与中介模式设计的所有对象的类型
    • 编写 registration 方法
      • 在mediator类中,编写所有注册方法来注册所有参与的对象。例如,参与的对象类型应该分别包含在注册方法的参数中
    • 在每个注册方法中,将从参数传递的对象分配给相应的私有成员。

    通过程序认识和了解中介者模式