中介者模式解决"对象间网状通信导致的耦合爆炸"——让所有通信都经过一个中介者,把网状关系变成星形关系。聊天室、机场调度就是它的场景。这篇讲清它怎么降低耦合。
一、解决什么问题:网状通信耦合爆炸
多个对象互相通信(A 给 B 发消息、B 给 C 发消息、C 给 A 发消息),对象之间形成网状关系,每个对象都要认识其他所有对象,耦合爆炸。
中介者模式:所有对象都只认识"中介者",通信都发给中介者,由中介者转发,网状变星形。
二、核心结构(聊天室)
java
// 中介者:聊天室,负责转发消息
class ChatRoom {
private List<User> users = new ArrayList<>();
void register(User u) { users.add(u); }
void send(User from, String message) {
for (User u : users) {
if (u != from) u.receive(message); // 中介者转发给其他所有人
}
}
}
// 同事:用户,只认识聊天室,不认识其他用户
class User {
private String name;
private ChatRoom room; // 只依赖中介者
User(String name, ChatRoom room) { this.name = name; this.room = room; }
void send(String message) {
room.send(this, name + " 说:" + message); // 发给中介者,由它转发
}
void receive(String message) { System.out.println(name + " 收到:" + message); }
}关键:User 只依赖 ChatRoom(中介者),不认识其他 User。加新用户、改通信逻辑,只需改中介者,用户类不动。
三、核心价值
- 降低耦合:对象从"认识所有对象"变成"只认识中介者"
- 集中通信逻辑:路由、转发逻辑集中在中介者里
四、实际应用
- 聊天室:用户不直接发消息,都经过聊天室
- 机场调度塔:飞机不直接交流,都听塔台调度
- 微服务网关/消息总线:服务间通信经过总线,不点对点直连
小结
- 中介者让对象通信都经过一个中间人,网状变星形,降低耦合
- 典型:聊天室、机场调度、消息总线
相关:《观察者模式》(观察者是"一对多通知",中介者是"多对多通信中转",容易混)。
