中介者模式
Mediator — 用一个中介对象来封装多个对象之间的交互
一句话理解
多个对象之间不再直接通信,而是通过一个中介者来协调。就像机场的塔台,所有飞机只和塔台通信,不需要互相联系。
解决什么问题
- N 个对象互相通信,关系是 N×N 的网状结构,复杂且难以维护
- 用中介者把网状变成星形结构,每个对象只和中介者打交道
怎么写
以"聊天室"为例:
// 中介者:聊天室
public class ChatRoom {
private final List<User> users = new ArrayList<>();
public void join(User user) {
users.add(user);
user.setChatRoom(this);
System.out.println(user.getName() + " 加入了聊天室");
}
// 中介者负责转发消息
public void sendMessage(String message, User sender) {
for (User user : users) {
if (user != sender) {
user.receive(sender.getName() + ": " + message);
}
}
}
}
// 参与者
public class User {
private final String name;
private ChatRoom chatRoom;
public User(String name) { this.name = name; }
public String getName() { return name; }
public void setChatRoom(ChatRoom room) { this.chatRoom = room; }
// 发消息:通过中介者
public void send(String message) {
chatRoom.sendMessage(message, this);
}
// 收消息
public void receive(String message) {
System.out.println(name + " 收到: " + message);
}
}ChatRoom room = new ChatRoom();
User alice = new User("Alice");
User bob = new User("Bob");
User charlie = new User("Charlie");
room.join(alice);
room.join(bob);
room.join(charlie);
alice.send("大家好!");
// Bob 收到: Alice: 大家好!
// Charlie 收到: Alice: 大家好!使用场景
- MVC 中的 Controller —— 协调 Model 和 View
- 聊天室/消息中间件
- 航空管制的塔台系统
- GUI 组件间的交互(对话框中多个控件联动)