中介者模式 (Mediator)
📖 通俗理解
想象一个房产中介:
- 没有中介:房东和租客直接联系,一个房东要和无数租客沟通
- 有中介:房东和租客都只和中介沟通,中介负责协调
中介者模式就是:用一个中介对象来封装一系列对象之间的交互,使对象之间不直接引用。
🎯 解决什么问题?
当多个对象之间存在复杂的网状依赖关系时,用中介者来解耦,变成星形结构。
网状结构(混乱) 星形结构(清晰)
A ─── B A
│ ╲ ╱ │ │
│ ╳ │ ──> 中介者
│ ╱ ╲ │ ╱ │ ╲
C ─── D B C D
🌰 生活中的例子
- 房产中介
- 聊天室:用户消息通过服务器转发
- 机场调度塔:飞机起降由调度塔协调
💻 Java 代码实现
场景:聊天室
/**
* 中介者接口:聊天室
*/
public interface ChatRoom {
void sendMessage(String message, User user);
void addUser(User user);
}
/**
* 具体中介者
*/
public class ChatRoomImpl implements ChatRoom {
private List<User> users = new ArrayList<>();
@Override
public void addUser(User user) {
users.add(user);
System.out.println(user.getName() + " 加入了聊天室");
}
@Override
public void sendMessage(String message, User sender) {
for (User user : users) {
if (user != sender) {
user.receive(message, sender.getName());
}
}
}
}
/**
* 同事类:用户
*/
public class User {
private String name;
private ChatRoom chatRoom;
public User(String name, ChatRoom chatRoom) {
this.name = name;
this.chatRoom = chatRoom;
}
public String getName() {
return name;
}
public void send(String message) {
System.out.println(name + " 发送: " + message);
chatRoom.sendMessage(message, this);
}
public void receive(String message, String from) {
System.out.println(name + " 收到来自 " + from + " 的消息: " + message);
}
}
使用:
public class Client {
public static void main(String[] args) {
ChatRoom chatRoom = new ChatRoomImpl();
User alice = new User("Alice", chatRoom);
User bob = new User("Bob", chatRoom);
User charlie = new User("Charlie", chatRoom);
chatRoom.addUser(alice);
chatRoom.addUser(bob);
chatRoom.addUser(charlie);
System.out.println();
alice.send("大家好!");
System.out.println();
bob.send("你好 Alice!");
}
}
输出:
Alice 加入了聊天室
Bob 加入了聊天室
Charlie 加入了聊天室
Alice 发送: 大家好!
Bob 收到来自 Alice 的消息: 大家好!
Charlie 收到来自 Alice 的消息: 大家好!
Bob 发送: 你好 Alice!
Alice 收到来自 Bob 的消息: 你好 Alice!
Charlie 收到来自 Bob 的消息: 你好 Alice!
✅ 适用场景
- 对象之间存在复杂的引用关系
- 想通过一个中间类来封装多个类的行为
- 想简化多个对象之间的通信
⚠️ 注意
中介者可能变得过于庞大和复杂(上帝类),需要注意控制。
小结
中介者模式:用中介对象封装对象间的交互,对象之间不直接引用。
应用:MVC 中的 Controller、消息队列
👉 下一篇:备忘录模式
