行为型 中等

中介者模式

Mediator Pattern

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

概述

中介者模式是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。

适用场景

  • 当一些对象和其他对象紧密耦合以致难以对其进行修改时
  • 当组件因过于依赖其他组件而无法在不同应用中复用时
  • 当为了能在不同情景下复用一些基本行为,需要创建大量组件子类时

优点

  • +单一职责原则:将多个组件间的交流抽取到同一位置,使其更易于理解和维护
  • +开闭原则:无需修改实际组件就能增加新的中介者
  • +可以减轻应用中多个组件间的耦合情况

缺点

  • 一段时间后,中介者可能会演化成上帝对象

结构

classDiagram class Mediator { <<interface>> +notify(sender, event) } class ConcreteMediator { -colleague1: Colleague -colleague2: Colleague +notify(sender, event) } class Colleague { #mediator: Mediator +setMediator(m) +send(message) +receive(message) } class ConcreteColleague1 { +send(message) +receive(message) +doSomething() } class ConcreteColleague2 { +send(message) +receive(message) +doSomethingElse() } class Client { +main() } Mediator <|.. ConcreteMediator Colleague <|-- ConcreteColleague1 Colleague <|-- ConcreteColleague2 ConcreteMediator o--> Colleague : manages Colleague --> Mediator : uses Client ..> ConcreteMediator : creates Client ..> ConcreteColleague1 : creates Client ..> ConcreteColleague2 : creates style Mediator fill:#e3f2fd,stroke:#1976d2,stroke-width:2px style ConcreteMediator fill:#e8f5e9,stroke:#388e3c,stroke-width:2px style Colleague fill:#fff3e0,stroke:#f57c00,stroke-width:2px style ConcreteColleague1 fill:#fce4ec,stroke:#c2185b,stroke-width:1px style ConcreteColleague2 fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px style Client fill:#f5f5f5,stroke:#616161,stroke-width:1px

交互演示

封装对象间的交互
Button
TextBox
ListBox
通过中介
MediatorDialog
🤝
点击左侧组件

点击组件观察中介者如何协调组件间的交互

生活类比

中介者就像是机场塔台

机场塔台

飞机(组件)不直接相互通信,而是通过塔台(中介者)协调起飞和降落。

代码实现

Example.java

实际应用

Java Message Queue

消息队列是中介者模式的典型应用,生产者消费者通过队列通信。

Example.java

MVC 架构中的控制器

MVC 模式中的 Controller 充当视图和模型之间的中介者,协调数据流。

Example.java

聊天服务器

即时通讯应用中的服务器作为中介者,转发用户之间的消息。

Example.java

练习

1

中介者模式的主要目的是什么?

2

中介者模式会增加对象之间的耦合度

3

中介者模式可能带来的问题是什么?