中介者模式¶
分类:行为型模式。
类结构¶
classDiagram
direction TB
class Mediator {
<<interface>>
+notify(Colleague sender, String event)
}
class ConcreteMediator {
+notify(Colleague sender, String event)
}
class Colleague {
<<abstract>>
#Mediator mediator
+changed(String event)
+receive(String event)*
}
class ConcreteColleagueA {
+receive(String event)
}
class ConcreteColleagueB {
+receive(String event)
}
Mediator <|.. ConcreteMediator
Colleague <|-- ConcreteColleagueA
Colleague <|-- ConcreteColleagueB
Colleague --> Mediator : 通知事件
ConcreteMediator --> ConcreteColleagueA : 协调
ConcreteMediator --> ConcreteColleagueB : 协调
角色定义¶
| 角色 | 定义 |
|---|---|
| Mediator(中介者接口) | 定义同事对象向中介者报告事件的接口。 |
| ConcreteMediator(具体中介者) | 了解各同事对象,根据收到的事件协调其他对象的响应,集中维护交互规则。 |
| Colleague(抽象同事) | 持有中介者引用,通过它报告事件,并定义接收协调结果的操作。 |
| ConcreteColleagueA / ConcreteColleagueB(具体同事) | 完成各自的业务操作,把需要协作的事件交给中介者处理。 |
Head First 示例:自动住宅中的设备联动¶
原书附录用 Bob 的自动住宅说明中介者:闹钟、咖啡壶、日历和洒水器需要相互配合,设备间直接通信会让联动规则分散在各处。中介者集中接收事件,并协调其他设备。
下面是**教学建模**:Alarm、CoffeePot、Calendar、Sprinkler 对应书中设备;HomeMediator、统一的 Device 抽象及事件接口由本笔记补充。协作步骤中的日历判断和设备动作只是演示联动规则的组织方式,不是原书提供的完整自动化程序。
| 示例类型 | 模式角色 | 职责 |
|---|---|---|
| HomeMediator | 具体中介者 | 持有设备引用,接收状态变化,集中决定需要查询或调用哪些设备。 |
| Device | 抽象同事 | 保存中介者引用,通过 changed() 报告事件。 |
| Alarm | 具体同事 | 表示闹钟,响铃时报告事件。 |
| CoffeePot | 具体同事 | 接受煮咖啡等协调指令。 |
| Calendar | 具体同事 | 提供日期相关信息,供中介者判断联动条件。 |
| Sprinkler | 具体同事 | 接受开启、停止灌溉等协调指令。 |
示例 UML¶
classDiagram
direction TB
class HomeMediator {
+onEvent(Device sender, String event)
}
class Device {
<<abstract>>
#HomeMediator mediator
+changed(String event)
}
class Alarm {
+ring()
}
class CoffeePot {
+brew()
}
class Calendar {
+isWeekend() boolean
}
class Sprinkler {
+start()
+stop()
}
Device <|-- Alarm
Device <|-- CoffeePot
Device <|-- Calendar
Device <|-- Sprinkler
Device --> HomeMediator : 上报事件
HomeMediator --> Alarm : 协调
HomeMediator --> CoffeePot : 协调
HomeMediator --> Calendar : 查询日期
HomeMediator --> Sprinkler : 协调
协作过程¶
- 装配住宅系统时,把设备交给
HomeMediator,并为设备设置中介者引用。 - 闹钟响起后向中介者报告事件,无需直接了解咖啡壶或洒水器。
- 中介者查询日历,并按当前规则决定是否启动咖啡壶或调整灌溉。
- 设备完成自身动作;增加或调整联动规则时,主要修改中介者中的协调逻辑。
场景来源(Google Books 原书公开检索片段;示例类图为本笔记整理):