在复杂系统中,你是否遇到过这样的情况:
- 多个对象之间相互调用
- 类之间互相依赖
- 一个改动影响多个模块
典型表现就是:
对象之间"网状依赖",越改越乱。
例如一个聊天室系统:
python
user1.send("hello")
user2.receive("hello")
user3.receive("hello")
如果用户之间互相调用:
python
user1.send("hello", user2, user3)
问题:
- 每个对象都要知道其他对象
- 耦合非常严重
- 难扩展
这正是 中介者模式(Mediator) 要解决的问题。
一、中介者模式解决什么问题?
一句话:
用一个中介对象封装一组对象之间的交互,从而降低对象之间的耦合。
关键词:
- 解耦对象关系
- 集中控制
- 简化交互
二、核心思想
不要让对象之间直接通信。
而是:
所有通信都通过"中介者"完成。
结构:
Colleague1 Colleague2 Colleague3
\ | /
Mediator
三、一个典型问题:聊天室
我们用聊天室来举例。
四、Python 实现中介者模式
1️⃣ 中介者
python
class ChatMediator:
def __init__(self):
self.users = []
def register(self, user):
self.users.append(user)
def send(self, message, sender):
for user in self.users:
if user != sender:
user.receive(message)
2️⃣ 同事类(参与者)
python
class User:
def __init__(self, name, mediator: ChatMediator):
self.name = name
self.mediator = mediator
self.mediator.register(self)
def send(self, message):
print(f"{self.name} 发送: {message}")
self.mediator.send(message, self)
def receive(self, message):
print(f"{self.name} 收到: {message}")
3️⃣ 使用方式
python
mediator = ChatMediator()
u1 = User("Alice", mediator)
u2 = User("Bob", mediator)
u3 = User("Charlie", mediator)
u1.send("Hello everyone")
输出:
Alice 发送: Hello everyone
Bob 收到: Hello everyone
Charlie 收到: Hello everyone
五、没有中介者会怎样?
如果不用中介者:
python
class User:
def send(self, message, users):
for u in users:
u.receive(message)
问题:
- 每个对象要持有其他对象
- 依赖关系爆炸
- 新增用户需要修改所有逻辑
六、中介者模式的核心价值
中介者模式本质是:
把"多对多关系"变成"一对多关系"。
原来:
A ↔ B ↔ C ↔ D(网状)
现在:
A → Mediator ← B ← C ← D
七、中介者 vs 观察者模式
很多人会混淆。
| 对比点 | 中介者模式 | 观察者模式 |
|---|---|---|
| 关系 | 多对多协调 | 一对多通知 |
| 控制中心 | 中介者 | Subject |
| 是否集中逻辑 | 是 | 否 |
一句话:
中介者是"统一调度",
观察者是"广播通知"。
八、中介者 vs 外观模式
| 对比点 | 中介者 | 外观 |
|---|---|---|
| 目的 | 协调对象交互 | 简化接口 |
| 是否管理交互 | 是 | 否 |
一句话:
外观是"对外简化",
中介者是"对内协调"。
九、真实项目中的应用
非常常见:
1️⃣ 聊天系统
- 用户之间通过服务器通信
2️⃣ GUI 系统
按钮、输入框、列表:
- 不直接互相调用
- 通过控制器协调
3️⃣ 微服务调度
- API Gateway / Orchestrator
- 统一调度多个服务
4️⃣ 工作流引擎
- 节点之间通过调度中心协作
十、中介者模式优缺点
✅ 优点
- 降低耦合
- 集中管理逻辑
- 易扩展
❌ 缺点
- 中介者可能变"上帝类"
- 逻辑过多集中
十一、什么时候使用中介者模式?
适合:
- 多对象复杂交互
- 对象之间依赖混乱
- 需要集中控制
不适合:
- 简单系统
- 交互关系少
十二、一句话总结
中介者模式的本质是:
让对象不再直接通信,而是通过一个中心协调。
换句话说:
不要让对象"互相找",让它们"找中间人"。