中介者模式(Mediator Pattern)是一种行为型设计模式,通过引入一个中介者对象来封装一组对象之间的交互,从而减少对象间的直接依赖,降低系统复杂度。该模式将对象间的网状通信结构转换为星型结构,使交互逻辑集中管理,提升系统的可维护性和扩展性。以下是系统性解析:
一、核心定义与设计目标
-
定义
中介者模式通过集中式协调机制,让多个对象(称为同事对象)不再直接相互引用,而是通过中介者进行通信。例如,聊天室中的用户不直接互发消息,而是通过聊天服务器中转。其核心思想是**“解耦对象间的复杂交互”**。 -
设计目标
- 解耦对象关系:避免同事对象间的直接依赖,降低耦合度。
- 集中管理交互:将分散的交互逻辑收拢到中介者中,简化对象职责。
- 动态扩展性:新增同事类或修改交互规则时,无需修改其他对象。
二、模式结构与角色划分
-
核心角色
- 抽象中介者(Mediator):定义与同事对象通信的接口(如
sendMessage()
)。 - 具体中介者(ConcreteMediator):实现协调逻辑,维护同事对象引用(如
ChatServer
管理用户列表)。 - 抽象同事类(Colleague):声明与中介者交互的方法(如
setMediator()
)。 - 具体同事类(ConcreteColleague):实现业务逻辑,通过中介者间接与其他同事交互(如
User
发送消息)。
- 抽象中介者(Mediator):定义与同事对象通信的接口(如
-
UML类图示例
+-------------------+ +-------------------+
| Mediator |<|------|>| Colleague |
| +notify() | | +setMediator() |
+-------------------+ +-------------------+
▲ ▲
| |
+-------------------+ +-------------------+
| ConcreteMediator | | ConcreteColleague |
| +notify() | | +send() |
+-------------------+ +-------------------+
- 交互流程
- 同事对象将请求发送给中介者,中介者根据逻辑转发给相关同事。
- 例如:用户A发送消息→中介者接收→判断接收者→转发给用户B。
三、优缺点分析
优点
- 松散耦合:同事对象仅依赖中介者,而非彼此。
- 简化维护:交互逻辑集中管理,避免代码分散。
- 灵活扩展:新增同事类只需注册到中介者,不影响其他对象。
缺点
- 中介者复杂度高:中介者类可能成为“上帝对象”,承担过多职责。
- 性能损耗:中介者集中处理请求,高频场景可能成为瓶颈。
四、适用场景
- 复杂交互系统
- GUI控件交互(如表单验证联动)。
- 多玩家游戏中的角色通信。
- 分布式协调
- 微服务架构中的服务调用协调。
- 事件驱动架构
- 消息队列中的事件路由(如订单状态更新通知)。
- 网状结构优化
- 将对象间的网状依赖转换为星型结构。
五、实现示例(Java)
以聊天室为例:
// 1. 抽象中介者
interface ChatMediator {
void sendMessage(String msg, User user);
void addUser(User user);
}
// 2. 具体中介者
class ChatServer implements ChatMediator {
private List<User> users = new ArrayList<>();
@Override public void addUser(User u) { users.add(u); }
@Override public void sendMessage(String msg, User sender) {
users.stream()
.filter(u -> u != sender)
.forEach(u -> u.receive(msg));
}
}
// 3. 抽象同事类
abstract class User {
protected ChatMediator mediator;
public User(ChatMediator m) { this.mediator = m; }
public abstract void send(String msg);
public abstract void receive(String msg);
}
// 4. 具体同事类
class ChatUser extends User {
public ChatUser(ChatMediator m) { super(m); }
@Override public void send(String msg) { mediator.sendMessage(msg, this); }
@Override public void receive(String msg) { System.out.println("收到消息:" + msg); }
}
// 客户端调用
public class Client {
public static void main(String[] args) {
ChatMediator server = new ChatServer();
User alice = new ChatUser(server);
User bob = new ChatUser(server);
server.addUser(alice); server.addUser(bob);
alice.send("你好!"); // Bob收到消息
}
}
六、实际应用案例
- Java Swing事件处理
- 按钮、文本框等组件通过
ActionListener
中介者协调事件响应。
- 按钮、文本框等组件通过
- Spring框架中的事件机制
ApplicationEventMulticaster
作为中介者,管理事件发布与监听。
- 航空调度系统
- 控制塔(中介者)协调航班起降,避免飞机直接通信。
七、与其他模式的对比
模式 | 核心差异 |
---|---|
观察者模式 | 观察者模式是分布式的,中介者模式是集中式的 |
门面模式 | 门面模式封装子系统接口,中介者模式协调平等对象间的交互 |
代理模式 | 代理模式控制对象访问,中介者模式协调对象间通信 |
八、总结
中介者模式通过引入协调层,有效解决了对象间复杂交互导致的耦合问题,尤其适用于网状通信结构的系统重构。其核心价值在于将分散的交互逻辑集中化,但需警惕中介者类的职责过载与性能瓶颈。实际开发中,可结合职责链模式分散中介者压力,或利用异步消息队列提升吞吐量。对于需要统一管理对象交互的场景(如GUI、分布式系统),该模式是降低耦合、提升可维护性的理想选择。