中介者模式
中介者模式用于把多个对象之间复杂的网状关系,收拢到一个中介者对象中。
一句话理解:对象之间不要互相乱连,统一通过中介者沟通。
解决什么问题
当系统中多个对象彼此直接调用时,关系会变成网状:
text
A -> B
A -> C
B -> A
B -> C
C -> A
C -> B对象越多,依赖越乱。修改一个对象,可能影响一大片。
中介者模式把交互集中到中介者:
text
A -> Mediator <- B
C -> Mediator <- D对象只认识中介者,不直接认识其他对象。
基本结构
text
Mediator
<- ColleagueA
<- ColleagueB
<- ColleagueC角色:
Mediator:中介者接口,定义对象之间的通信方式。ConcreteMediator:具体中介者,封装交互逻辑。Colleague:同事对象,只和中介者通信。
Java 示例
聊天室就是典型中介者。
中介者接口:
java
interface ChatRoom {
void send(String from, String message);
}具体中介者:
java
import java.util.ArrayList;
import java.util.List;
class GroupChatRoom implements ChatRoom {
private final List<User> users = new ArrayList<>();
public void join(User user) {
users.add(user);
}
public void send(String from, String message) {
for (User user : users) {
if (!user.name().equals(from)) {
user.receive(from, message);
}
}
}
}同事对象:
java
class User {
private final String name;
private final ChatRoom chatRoom;
User(String name, ChatRoom chatRoom) {
this.name = name;
this.chatRoom = chatRoom;
}
public String name() {
return name;
}
public void send(String message) {
chatRoom.send(name, message);
}
public void receive(String from, String message) {
System.out.println(name + " receive from " + from + ": " + message);
}
}使用:
java
GroupChatRoom room = new GroupChatRoom();
User tom = new User("tom", room);
User jack = new User("jack", room);
room.join(tom);
room.join(jack);
tom.send("hello");用户之间不直接互相持有引用,而是通过聊天室转发消息。
使用场景
- 聊天室。
- UI 组件协作。
- 工作流调度。
- 事件总线。
- 多对象交互复杂的模块。
优点
- 减少对象之间的直接依赖。
- 交互逻辑集中管理。
- 对象本身更简单。
- 方便调整协作流程。
缺点
- 中介者容易变得很复杂。
- 所有交互集中到一个地方,可能形成新的上帝类。
- 中介者出问题会影响整个协作流程。
和观察者模式的区别
| 模式 | 重点 |
|---|---|
| 中介者 | 多个对象之间复杂交互的集中协调 |
| 观察者 | 一个对象变化后通知多个观察者 |
中介者更像“协调中心”,观察者更像“事件通知”。
实战注意
中介者不是为了把所有业务逻辑都塞到一个类里。它适合管理对象之间的交互关系,而不是替代对象自身职责。