《中介者模式》|设计模式系列第22篇
系列:行为型模式 · 中介者模式(Mediator Pattern)
关键词:解耦多对象交互、中央调度、减少对象耦合、同事类
一、什么是中介者模式
中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
属于行为型设计模式。

简单理解:
多个同事对象不再直接互相通信,所有消息都交给中介者中转。同事类只依赖中介者,不需要持有其他同事的引用,将网状复杂依赖转为星型结构。
例子:聊天室。所有用户不直接互相发消息,全部发送给聊天室(中介者),由聊天室转发给目标用户。
核心意图
将多对多对象交互逻辑抽离到中介者,降低同事对象之间耦合。
适用场景
- 多个对象之间存在复杂多对多交互关系
- 想集中管理交互逻辑
- 复用同事对象,同事之间解耦
- 聊天室、消息网关、事件调度器、UI组件联动
⚠️ 缺点预警:交互逻辑全部汇聚到中介者,中介者会变得庞大复杂,维护成本上升。
二、UML结构图
角色划分:
- Mediator(抽象中介者):定义同事对象通信接口
- ConcreteMediator(具体中介者):维护所有同事引用,实现交互调度逻辑
- Colleague(抽象同事):持有中介者引用,发送/接收消息
- ConcreteColleague(具体同事):实现自身业务,通信交给中介者
- Client(客户端):创建中介者与同事对象,绑定关系

三、Java 完整示例
场景:ChatRoom 聊天室中介,User 用户同事类。代码全部使用英文。
import java.util.ArrayList;
import java.util.List;
// Mediator
public interface Mediator {
void register(User user);
void relay(String from, String message);
}
// ConcreteMediator
public class ChatRoom implements Mediator {
private List<User> userList = new ArrayList<>();
@Override
public void register(User user) {
userList.add(user);
user.setMediator(this);
}
@Override
public void relay(String from, String message) {
for(User user : userList) {
if(!user.getName().equals(from)) {
user.receive(from, message);
}
}
}
}
// Colleague
public abstract class User {
protected Mediator mediator;
protected String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public abstract void send(String message);
public abstract void receive(String from, String message);
}
// ConcreteColleague
public class ChatUser extends User {
public ChatUser(String name) {
super(name);
}
@Override
public void send(String message) {
mediator.relay(name, message);
}
@Override
public void receive(String from, String message) {
System.out.println(name + " receive message from " + from + ": " + message);
}
}
// Client
public class Client {
public static void main(String[] args) {
Mediator chatRoom = new ChatRoom();
User u1 = new ChatUser("Alice");
User u2 = new ChatUser("Bob");
User u3 = new ChatUser("Jack");
chatRoom.register(u1);
chatRoom.register(u2);
chatRoom.register(u3);
u1.send("Hello everyone");
u2.send("Hi Alice");
}
}
运行输出:
Bob receive message from Alice: Hello everyone
Jack receive message from Alice: Hello everyone
Alice receive message from Bob: Hi Alice
Jack receive message from Bob: Hi Alice
四、中介者模式 vs 观察者模式
| 模式 | 目标 | 核心 |
|---|---|---|
| Mediator | 多对象之间双向交互,由中介统一调度 | 集中控制多方通信,同事不知道彼此 |
| Observer | 一对多单向消息推送,主题通知订阅者 | 主题发生变化,自动通知所有观察者 |
五、优缺点总结
✅ 优点
- 将多对多复杂依赖简化为一对多(同事 ↔ 中介者)
- 同事之间解耦,可以独立修改同事类
- 交互逻辑集中在中介,方便统一管理
❌ 缺点
- 所有交互逻辑集中在中介者,中介类容易膨胀、变成上帝类
- 中介者一旦复杂,调试和维护困难
六、框架源码应用
- Spring MVC DispatcherServlet(前端控制器,中介思想)
- JMS消息中间件
- EventBus 事件总线
七、小结
中介者模式核心:同事对象不直接通信,全部通过中介者转发消息,消除多对多耦合。
使用建议:对象之间网状依赖时考虑中介者;控制中介者复杂度,避免中介无限膨胀。
0 条笔记