跳转至

中介者模式

分类:行为型模式。

类结构

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 : 协调

协作过程

  1. 装配住宅系统时,把设备交给 HomeMediator,并为设备设置中介者引用。
  2. 闹钟响起后向中介者报告事件,无需直接了解咖啡壶或洒水器。
  3. 中介者查询日历,并按当前规则决定是否启动咖啡壶或调整灌溉。
  4. 设备完成自身动作;增加或调整联动规则时,主要修改中介者中的协调逻辑。

场景来源(Google Books 原书公开检索片段;示例类图为本笔记整理):

评论