一、定义(Definition)
中介者模式(Mediator Pattern)是一种行为型设计模式,它通过一个中介对象来封装一系列对象之间的交互,使对象之间不需要直接引用彼此,从而降低它们之间的耦合度。
简而言之,中介者模式将多个对象间复杂的通信关系转移到一个中介者对象中,使得对象之间的耦合松散,交互更灵活且易维护。
二、适用场景(When to Use)
- 系统中对象之间存在复杂的网状通信关系,难以维护和扩展;
- 希望简化对象之间的通信,避免对象间相互引用;
- 需要集中控制交互行为,便于管理和拓展;
- 适合用在聊天室、飞机调度、GUI 事件处理、工作流协调等场景。
三、核心角色(Participants)
角色 |
说明 |
Mediator |
抽象中介者,定义同事对象通信的接口 |
ConcreteMediator |
具体中介者,协调各个同事对象之间的交互 |
Colleague |
抽象同事类,声明与中介者通信的接口 |
ConcreteColleague |
具体同事类,实现同事的具体行为和与中介者的通信 |
四、UML 类图(UML Diagram)
+-----------------------+
| Mediator -----|
|-----------------------|
| +send(message, sender)|
+-----------------------+
▲
|
+------------------------+
| ConcreteMediator |
|------------------------|
| - colleague1 |
| - colleague2 |
| +send() |
+------------------------+
+------------+ +-------------+
| Colleague | | Colleague |
|------------| |-------------|
| +send() | | +send() |
| +receive() | | +receive() |
+------------+ +-------------+
▲ ▲
| |
+-----------------+ +------------------+
| ConcreteColleague1| | ConcreteColleague2|
+------------------+ +-------------------+
五、真实业务场景示例
场景说明:聊天室(Chat Room)
假设有多个用户(同事类)参与聊天,通过聊天室(中介者)来转发消息,避免用户之间直接通信。
1. 抽象中介者(Mediator 角色)
// Mediator:抽象中介者,定义发送消息接口
public interface ChatRoomMediator {
void sendMessage(String message, User sender);
void addUser(User user);
}
2. 具体中介者(ConcreteMediator 角色)
// ConcreteMediator:具体聊天室,负责协调用户消息转发
public class ChatRoom implements ChatRoomMediator {
private List<User> users = new ArrayList<>();
@Override
public void sendMessage(String message, User sender) {
for (User user : users) {
// 不发送给消息发送者自己
if (user != sender) {
user.receive(message);
}
}
}
@Override
public void addUser(User user) {
users.add(user);
}
}
3. 抽象同事类(Colleague 角色)
// Colleague:抽象用户类,关联中介者
public abstract class User {
protected ChatRoomMediator mediator;
protected String name;
public User(ChatRoomMediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
public abstract void send(String message);
public abstract void receive(String message);
}
4. 具体同事类(ConcreteColleague 角色)
// ConcreteColleague:具体用户类,实现发送和接收消息
public class ChatUser extends User {
public ChatUser(ChatRoomMediator mediator, String name) {
super(mediator, name);
}
@Override
public void send(String message) {
System.out.println(this.name + " 发送消息: " + message);
mediator.sendMessage(message, this);
}
@Override
public void receive(String message) {
System.out.println(this.name + " 收到消息: " + message);
}
}
5. 客户端测试(Client)
public class MediatorPatternDemo {
public static void main(String[] args) {
ChatRoomMediator chatRoom = new ChatRoom();
User alice = new ChatUser(chatRoom, "Alice");
User bob = new ChatUser(chatRoom, "Bob");
User charlie = new ChatUser(chatRoom, "Charlie");
chatRoom.addUser(alice);
chatRoom.addUser(bob);
chatRoom.addUser(charlie);
alice.send("Hello everyone!");
bob.send("Hi Alice!");
}
}
六、类与角色对照表
类名 |
模式角色 |
说明 |
|
Mediator |
抽象中介者,定义通信接口 |
|
ConcreteMediator |
具体中介者,实现通信协调 |
|
Colleague |
抽象同事,定义接口 |
|
ConcreteColleague |
具体同事,实现具体行为 |
|
Client |
客户端,测试中介者模式 |
七、优缺点分析
✅ 优点
优点 |
说明 |
降低对象间耦合度 |
同事对象不直接引用彼此,依赖中介者 |
统一管理交互 |
中介者集中处理交互逻辑,便于维护和修改 |
符合单一职责原则 |
各个同事对象专注自身业务,中介者负责通信 |
便于扩展和复用 |
新增同事类或修改交互方式只需改中介者 |
❌ 缺点
缺点 |
说明 |
中介者过于复杂 |
所有交互集中,中介者逻辑可能变得臃肿 |
中介者承担过多责任 |
可能违背单一职责,维护难度提升 |
性能开销 |
中介者转发消息可能引入额外开销 |
八、真实应用场景
场景 |
描述 |
聊天系统 |
多用户消息通过中介者(服务器)转发 |
航空交通控制 |
飞机通过中介者(空中交通管制)协调起降 |
GUI 组件交互 |
各控件通过中介者管理事件传递 |
工作流管理 |
各节点通过中介者协同完成复杂流程 |
设备互联 |
物联网设备通过中介器统一管理和通信 |
九、总结(Summary)
中介者模式通过引入中介者对象,减少了系统中对象间的直接依赖,使系统更具灵活性和可维护性。适合用于对象间复杂交互,集中管理逻辑,特别是多对多的通信场景。