中介者模式 (Mediator Pattern)
文章目录
- 中介者模式 (Mediator Pattern)
- 原理
- 优点
- 缺点
- 示例代码
- 场景描述
- 1. 定义中介者接口
- 2. 实现具体中介者
- 3. 定义同事类接口
- 4. 实现具体同事类
- 5. 客户端代码
- 输出结果
- UML 类图
- 使用场景
- 小结
中介者模式 (Mediator Pattern)
中介者模式是一种 行为型设计模式,用来降低对象之间的耦合性。它通过引入一个中介者对象,来统一管理对象之间的交互,使得各对象无需直接引用彼此,从而使系统更加灵活和易于扩展。
原理
- 核心思想:
- 将对象之间复杂的网状关系转化为简单的星型关系。
- 对象通过中介者进行通信,避免直接相互依赖。
- 适用场景:
- 系统中对象之间存在大量交互,导致对象之间耦合度过高。
- 希望通过引入中介者减少对象之间的直接依赖。
- 需要动态增加或减少交互对象。
- 参与角色:
- Mediator(中介者接口):
- 定义与同事对象交互的接口。
- ConcreteMediator(具体中介者):
- 实现中介者接口,负责协调各同事对象的交互。
- Colleague(同事类接口):
- 定义与中介者通信的方法。
- ConcreteColleague(具体同事类):
- 具体的对象类,通过中介者与其他对象交互。
- Mediator(中介者接口):
优点
- 降低耦合:
- 对象之间不直接通信,减少了类之间的依赖。
- 增强灵活性:
- 可以方便地修改交互逻辑或增加新对象。
- 集中管理:
- 交互逻辑集中在中介者中,便于维护。
缺点
- 中介者复杂性:
- 中介者承担了所有交互逻辑,可能变得复杂且难以维护。
- 单点问题:
- 中介者过于重要,如果其出现问题,会影响所有交互。
示例代码
场景描述
一个聊天室系统中,用户通过聊天室发送消息,而不是直接与其他用户通信。
1. 定义中介者接口
// 中介者接口
public interface ChatMediator {
void sendMessage(String message, User user);
void addUser(User user);
}
2. 实现具体中介者
import java.util.ArrayList;
import java.util.List;
// 具体中介者
public class ChatRoom implements ChatMediator {
private List<User> users;
public ChatRoom() {
this.users = new ArrayList<>();
}
@Override
public void addUser(User user) {
users.add(user);
}
@Override
public void sendMessage(String message, User sender) {
for (User user : users) {
// 消息不会发送给发送者自己
if (user != sender) {
user.receive(message, sender.getName());
}
}
}
}
3. 定义同事类接口
// 同事类接口
public abstract class User {
protected ChatMediator mediator;
protected String name;
public User(ChatMediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
public String getName() {
return name;
}
public abstract void send(String message);
public abstract void receive(String message, String senderName);
}
4. 实现具体同事类
// 具体同事类
public class ChatUser extends User {
public ChatUser(ChatMediator mediator, String name) {
super(mediator, name);
}
@Override
public void send(String message) {
System.out.println(this.name + " sends: " + message);
mediator.sendMessage(message, this);
}
@Override
public void receive(String message, String senderName) {
System.out.println(this.name + " received from " + senderName + ": " + message);
}
}
5. 客户端代码
public class MediatorPatternExample {
public static void main(String[] args) {
// 创建中介者
ChatMediator chatRoom = new ChatRoom();
// 创建用户
User user1 = new ChatUser(chatRoom, "Alice");
User user2 = new ChatUser(chatRoom, "Bob");
User user3 = new ChatUser(chatRoom, "Charlie");
// 添加用户到聊天室
chatRoom.addUser(user1);
chatRoom.addUser(user2);
chatRoom.addUser(user3);
// 用户发送消息
user1.send("Hi everyone!");
user2.send("Hello Alice!");
}
}
输出结果
Alice sends: Hi everyone!
Bob received from Alice: Hi everyone!
Charlie received from Alice: Hi everyone!
Bob sends: Hello Alice!
Alice received from Bob: Hello Alice!
Charlie received from Bob: Hello Alice!
UML 类图
+----------------+
| ChatMediator |
+----------------+
| + sendMessage()|
| + addUser() |
+----------------+
^
|
+-------------------------------+
| ConcreteMediator (ChatRoom) |
+-------------------------------+
| - users : List<User> |
| + sendMessage() |
| + addUser() |
+-------------------------------+
^
|
+----------------+
| User |
+----------------+
| - mediator |
| - name |
| + send() |
| + receive() |
+----------------+
^
|
+--------------------------------+
| ConcreteColleague (ChatUser) |
+--------------------------------+
| + send() |
| + receive() |
+--------------------------------+
使用场景
- 聊天室系统:
- 如 Slack、Teams 等系统。
- GUI组件交互:
- 在图形界面中,各组件(如按钮、文本框)通过中介者协同工作。
- 工作流管理:
- 如订单处理系统中,订单、支付、库存等模块通过中介者通信。
小结
- 中介者模式通过引入中介者减少了对象之间的耦合,使得系统更加灵活。
- 适用于需要协调多个对象行为的场景。
- 需注意中介者可能成为系统的单点瓶颈,应合理设计其复杂度和职责范围。