18.设计模式 MEDIATOR(中介者)
一、模式定义与核心思想
中介者模式是一种行为型设计模式,其核心目标是通过引入中介对象封装多个对象间的交互,将原本复杂的网状依赖转化为星型结构,实现松耦合与集中控制。该模式通过将对象间的通信逻辑抽象到中介层,赋予系统以下核心价值:
- 解耦对象依赖:消除对象间的直接引用,降低耦合度(如飞机通过塔台调度而非直接协商)。
- 统一交互规则:集中管理通信协议与业务流程(如聊天室消息路由、智能家居场景联动)。
- 动态扩展性:新增对象只需与中介交互,无需修改现有逻辑(如新增设备至智能家居系统)。
经典场景:
- 多组件GUI界面的事件分发(如表单验证联动)
- 分布式系统的服务协调(如微服务注册中心)
- 游戏引擎中的角色行为调度(如战斗状态同步)
二、模式组成与UML类图
核心角色
- Mediator(抽象中介者):
- 定义通信接口(如
notify()方法),声明对象间交互规则。
- ConcreteMediator(具体中介者):
- 实现交互逻辑,维护同事对象集合(如
ChatServer管理用户列表)。
- Colleague(抽象同事类):
- 持有中介者引用,定义通信方法(如
send()和receive())。
- ConcreteColleague(具体同事类):
- 实现业务逻辑,通过中介者传递消息(如聊天室用户、智能家居设备)。
UML类图
classDiagram
class Mediator {
<<interface>>
+notify(sender: Colleague, event: String)
}
class ConcreteMediator {
-colleagues: List<Colleague>
+register(colleague: Colleague)
+notify(sender: Colleague, event: String)
}
class Colleague {
<<abstract>>
-mediator: Mediator
+send(event: String)
+receive(event: String)
}
class ConcreteColleagueA {
+send(event: String)
+receive(event: String)
}
class ConcreteColleagueB {
+send(event: String)
+receive(event: String)
}
Mediator <|-- ConcreteMediator
Colleague <|-- ConcreteColleagueA
Colleague <|-- ConcreteColleagueB
ConcreteMediator --> Colleague : manages
Colleague --> Mediator : delegates

三、代码实现示例
场景:实现智能家居设备联动(灯光、空调、音响)
// 1. 抽象中介者
interface SmartHomeMediator {
void registerDevice(Device device);
void notify(Device sender, String event);
}
// 2. 具体中介者(中央控制器)
class CentralController implements SmartHomeMediator {
private List<Device> devices = new ArrayList<>();
@Override
public void registerDevice(Device device) {
devices.add(device);
}
@Override
public void notify(Device sender, String event) {
for (Device device : devices) {
if (device != sender) {
device.receive(event);
}
}
}
}
// 3. 抽象同事类
abstract class Device {
protected SmartHomeMediator mediator;
public Device(SmartHomeMediator mediator) {
this.mediator = mediator;
mediator.registerDevice(this);
}
public abstract void send(String event);
public abstract void receive(String event);
}
// 4. 具体同事类
class Light extends Device {
public Light(SmartHomeMediator mediator) {
super(mediator);
}
@Override
public void send(String event) {
System.out.println("[灯光] 发送事件: " + event);
mediator.notify(this, event);
}
@Override
public void receive(String event) {
if ("回家模式".equals(event)) {
System.out.println(">> 灯光自动开启");
} else if ("离家模式".equals(event)) {
System.out.println(">> 灯光自动关闭");
}
}
}
class AirConditioner extends Device {
public AirConditioner(SmartHomeMediator mediator) {
super(mediator);
}
@Override
public void send(String event) {
System.out.println("[空调] 发送事件: " + event);
mediator.notify(this, event);
}
@Override
public void receive(String event) {
if ("回家模式".equals(event)) {
System.out.println(">> 空调调至26℃");
}
}
}
// 5. 客户端调用
public class Client {
public static void main(String[] args) {
SmartHomeMediator mediator = new CentralController();
Device light = new Light(mediator);
Device ac = new AirConditioner(mediator);
light.send("回家模式"); // 触发联动
}
}
输出结果:
[灯光] 发送事件: 回家模式
>> 空调调至26℃
四、工业级源码应用
- Spring MVC框架
-
DispatcherServlet作为请求分发的中介者,协调Controller、ViewResolver等组件
7
14
-
- 。
- Java Timer调度器
-
Timer类通过TaskQueue管理定时任务,协调任务执行顺序
1
13
-
- 。
- 聊天服务器架构
-
- 如Netty实现的聊天室,服务端作为中介者转发消息至其他客户端
2
6
-
- 。
- Android事件总线
-
EventBus库通过中介者模式解耦组件间的事件传递
3
12
-
- 。
- 微服务注册中心
-
- Eureka/Nacos作为服务协调中介,管理服务发现与健康检查
7
14
-
- 。
五、模式对比与最佳实践
优势:
- 降低75%+的耦合度:通过集中管理交互逻辑(如智能家居场景联动)
1
4
- 。
- 提升可维护性:修改交互规则只需调整中介者(如聊天室新增消息过滤)
6
12
- 。
局限性:
- 中介者臃肿风险:复杂系统中可能成为“上帝对象”(需按业务拆分多个中介者)
3
10
- 。
- 性能损耗:高频交互场景可能因中介层引入延迟(如实时游戏引擎)
11
14
- 。
实践建议:
- 明确职责边界:中介者应仅处理协调逻辑,避免包含业务代码
8
13
- 。
- 结合观察者模式:通过事件驱动提升扩展性(如Spring的事件监听机制)
3
14
- 。
总结
中介者模式如同软件架构的“交通指挥官”,通过集中调度与协议抽象,在智能家居、分布式系统等场景中展现出强大的解耦能力。其设计精髓在于将交互复杂性封装为可管理单元,开发者需重点把控中介者的职责粒度,结合具体场景选择静态或动态实现方式,从而构建出高内聚、低耦合的弹性架构。

浙公网安备 33010602011771号