23种设计模式之中介者模式
·
中介者模式 (Mediator Pattern) 详细介绍
一、模式概述
-
英文名称:Mediator
-
核心目标:定义一个中介对象来封装一组对象之间的交互,减少对象间直接通信的复杂性,促进松耦合。
-
设计思想:通过集中控制交互逻辑,将网状的多对多通信转化为星型的一对多结构,简化系统维护。
二、优缺点
| 优点 | 缺点 |
|---|---|
| 1. 减少对象间依赖:对象仅与中介交互,降低耦合。 | 1. 中介类复杂度高:可能成为“上帝类”。 |
| 2. 简化对象间协作:交互逻辑集中管理。 | 2. 性能瓶颈:中介类处理大量通信可能成为性能瓶颈。 |
| 3. 易于扩展新对象:新增对象只需修改中介类。 | 3. 设计难度大:需精准划分对象职责。 |
三、应用场景
-
聊天室系统:用户间消息通过聊天室中转。
-
航空调度系统:塔台协调飞机起飞、降落。
-
GUI 组件交互:表单输入控件间的联动(如选择国家后更新城市列表)。
-
微服务协调:服务间通过 API 网关通信。
四、代码实现与注释
1. 中介者接口(定义通信规范)
/**
* 中介者接口:定义组件间通信的方法
*/
public interface ChatMediator {
void sendMessage(String message, User user);
void addUser(User user);
}
2. 同事类接口(定义组件行为)
/**
* 同事类接口:定义用户的基本行为
*/
public abstract class User {
protected ChatMediator mediator;
protected String name;
public User(ChatMediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
// 发送消息(委托给中介者)
public abstract void send(String message);
// 接收消息
public abstract void receive(String message);
}
3. 具体中介者类(实现协调逻辑)
import java.util.ArrayList;
import java.util.List;
/**
* 具体中介者:聊天室(管理用户并转发消息)
*/
public class ChatRoom implements ChatMediator {
private final List<User> users = new ArrayList<>();
@Override
public void addUser(User user) {
users.add(user);
System.out.println(user.name + " 加入聊天室");
}
@Override
public void sendMessage(String message, User sender) {
// 向除发送者外的所有用户广播消息
for (User user : users) {
if (user != sender) {
user.receive(sender.name + " 说:" + message);
}
}
}
}
4. 具体同事类(用户实现)
/**
* 普通用户:通过中介者发送消息
*/
public class BasicUser extends User {
public BasicUser(ChatMediator mediator, String name) {
super(mediator, name);
}
@Override
public void send(String message) {
System.out.println(name + " 发送消息:" + message);
mediator.sendMessage(message, this);
}
@Override
public void receive(String message) {
System.out.println(name + " 收到消息:" + message);
}
}
/**
* 管理员用户:拥有特殊权限(如发送广播)
*/
public class AdminUser extends User {
public AdminUser(ChatMediator mediator, String name) {
super(mediator, name);
}
@Override
public void send(String message) {
System.out.println("[管理员] " + name + " 发送通知:" + message);
mediator.sendMessage(message, this);
}
@Override
public void receive(String message) {
System.out.println("[管理员] " + name + " 收到消息:" + message);
}
}
5. 客户端调用
public class Client {
public static void main(String[] args) {
// 创建中介者(聊天室)
ChatMediator chatRoom = new ChatRoom();
// 创建用户并注册到聊天室
User alice = new BasicUser(chatRoom, "Alice");
User bob = new BasicUser(chatRoom, "Bob");
User admin = new AdminUser(chatRoom, "系统管理员");
chatRoom.addUser(alice);
chatRoom.addUser(bob);
chatRoom.addUser(admin);
// 用户间发送消息(通过中介者转发)
System.out.println("\n===== 用户消息测试 =====");
alice.send("大家好!");
bob.send("欢迎 Alice!");
System.out.println("\n===== 管理员广播测试 =====");
admin.send("服务器将于今晚维护!");
}
}
6. 输出结果
Alice 加入聊天室
Bob 加入聊天室
系统管理员 加入聊天室
===== 用户消息测试 =====
Alice 发送消息:大家好!
Bob 收到消息:Alice 说:大家好!
系统管理员 收到消息:Alice 说:大家好!
Bob 发送消息:欢迎 Alice!
Alice 收到消息:Bob 说:欢迎 Alice!
系统管理员 收到消息:Bob 说:欢迎 Alice!
===== 管理员广播测试 =====
[管理员] 系统管理员 发送通知:服务器将于今晚维护!
Alice 收到消息:系统管理员 说:服务器将于今晚维护!
Bob 收到消息:系统管理员 说:服务器将于今晚维护!
五、模式结构图
+----------------+ +----------------+
| Mediator | <------+ | Colleague |
+----------------+ +----------------+
| +notify() | | -mediator:Mediator |
+----------------+ | +send() |
^ | +receive() |
| +----------------+
|
+----------------+
| ConcreteMediator|
+----------------+
| +notify() |
+----------------+
|
|
+----------------+
| ConcreteColleague|
+----------------+
| +send() |
| +receive() |
+----------------+
六、与其他模式的关系
-
观察者模式:中介者模式可基于观察者模式实现,但更强调双向通信。
-
门面模式:中介者协调对象间交互,门面模式简化子系统访问。
-
代理模式:中介者可能代理对象间的通信,但目标不同。
七、最佳实践
-
合理划分职责:避免中介者类承担过多逻辑,必要时拆分多个中介者。
-
接口设计清晰:定义明确的通信协议,避免直接暴露对象细节。
-
异步处理:对高并发场景,使用消息队列作为中介者。
八、总结
-
核心价值:通过集中管理对象交互,降低系统耦合度,提升可维护性。
-
适用场景:对象间存在复杂网状通信关系的系统(如聊天应用、控制系统)。
-
关键实现:中介者接口 + 同事类接口 + 协调逻辑。
中介者模式在 Java 生态中的典型应用包括:
-
Java Message Service (JMS):消息队列作为中介者协调生产者与消费者。
-
Spring MVC 的 DispatcherServlet:协调控制器、视图解析器等组件。
-
事件总线框架:如 Google Guava 的
EventBus。
掌握该模式能有效解决复杂对象交互问题,提升代码的可读性和扩展性。
更多推荐
所有评论(0)