行为型 中等
中介者模式
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