
文章目录
-
- [1. 引言:对象之间为什么会纠缠不清?](#1. 引言:对象之间为什么会纠缠不清?)
- [2. 什么是中介者模式](#2. 什么是中介者模式)
-
- [GoF 定义](#GoF 定义)
- [3. 中介者模式的核心思想](#3. 中介者模式的核心思想)
- [4. 中介者模式的结构](#4. 中介者模式的结构)
- [5. 示例:聊天室系统](#5. 示例:聊天室系统)
-
- [5.1 中介者接口](#5.1 中介者接口)
- [5.2 具体中介者](#5.2 具体中介者)
- [5.3 同事类](#5.3 同事类)
- [5.4 具体同事类](#5.4 具体同事类)
- [5.5 客户端使用](#5.5 客户端使用)
- [6. 中介者模式的优点](#6. 中介者模式的优点)
- [7. 中介者模式的缺点](#7. 中介者模式的缺点)
- [8. 中介者 vs 观察者 vs 责任链](#8. 中介者 vs 观察者 vs 责任链)
- [9. JDK / 框架中的中介者思想](#9. JDK / 框架中的中介者思想)
-
- [MVC 中的 Controller](#MVC 中的 Controller)
- [10. 适用场景](#10. 适用场景)
- [11. 一个常见误区](#11. 一个常见误区)
- 参考

1. 引言:对象之间为什么会纠缠不清?
在复杂系统中,你可能见过这样的代码:
java
class User {
void send(Message msg, User to) {
to.receive(msg);
}
}
随着功能增加:
- 群聊
- 在线状态
- 消息过滤
- 转发、统计
对象之间开始:
- 互相引用
- 逻辑交叉
- 修改牵一发而动全身
当"对象之间的交互关系"变得复杂时,中介者模式就是解耦利器。
对象不直接聊天,统一找中介。
2. 什么是中介者模式
GoF 定义
用一个中介对象来封装一系列对象交互,使各对象不需要显式地相互引用,从而使其耦合松散。
详细解释:中介者模式,又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。
一句话理解:
对象不再直接交流,统一交给中介。
3. 中介者模式的核心思想
中介者模式的本质是:
- 把"多对多交互"变成"一对多"
- 把协作逻辑集中到一个地方
- 同事对象只依赖中介者
用集中管理,换取对象解耦。
4. 中介者模式的结构
中介者模式包含四个角色:
- Mediator(抽象中介者)
它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
- ConcreteMediator(具体中介者)
实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
- Colleague(同事类)
定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
- ConcreteColleague
是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
5. 示例:聊天室系统
5.1 中介者接口
java
public interface ChatMediator {
void sendMessage(String msg, User user);
}
5.2 具体中介者
java
import java.util.ArrayList;
import java.util.List;
public class ChatRoom implements ChatMediator {
private List<User> users = new ArrayList<>();
public void register(User user) {
users.add(user);
}
@Override
public void sendMessage(String msg, User from) {
for (User user : users) {
if (user != from) {
user.receive(msg);
}
}
}
}
5.3 同事类
java
public abstract class User {
protected ChatMediator mediator;
protected String name;
public User(ChatMediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
public abstract void send(String msg);
public abstract void receive(String msg);
}
5.4 具体同事类
java
public class ConcreteUser extends User {
public ConcreteUser(ChatMediator mediator, String name) {
super(mediator, name);
}
@Override
public void send(String msg) {
System.out.println(name + " 发送消息:" + msg);
mediator.sendMessage(msg, this);
}
@Override
public void receive(String msg) {
System.out.println(name + " 收到消息:" + msg);
}
}
5.5 客户端使用
java
ChatRoom chatRoom = new ChatRoom();
User u1 = new ConcreteUser(chatRoom, "Alice");
User u2 = new ConcreteUser(chatRoom, "Bob");
chatRoom.register(u1);
chatRoom.register(u2);
u1.send("你好!");
6. 中介者模式的优点
- 解耦对象关系
中介者模式通过把多个同事对象之间的交互封装到中介者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互补依赖。这样一来,同事对象就可以独立地变化和复用,而不再像以前那样"牵一处而动全身"了。
- 集中管理交互逻辑
- 易于维护
- 符合单一职责原则
7. 中介者模式的缺点
- 中介者可能变得臃肿
- 所有逻辑集中,风险集中
- 不适合极简单交互
8. 中介者 vs 观察者 vs 责任链
| 模式 | 解决的问题 |
|---|---|
| 中介者 | 多对象交互 |
| 观察者 | 事件通知 |
| 责任链 | 请求传递 |
9. JDK / 框架中的中介者思想
MVC 中的 Controller
- View 和 Model 不直接通信
- Controller 作为中介协调
10. 适用场景
- 聊天系统
- GUI 组件交互
- 工作流协调
- 解耦复杂业务对象
11. 一个常见误区
中介者不是"万能中控",而是"交互协调者"。