设计模式实战:中介者模式(Mediator)

在复杂系统中,你是否遇到过这样的情况:

  • 多个对象之间相互调用
  • 类之间互相依赖
  • 一个改动影响多个模块

典型表现就是:

对象之间"网状依赖",越改越乱。

例如一个聊天室系统:

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️⃣ 工作流引擎

  • 节点之间通过调度中心协作

十、中介者模式优缺点

✅ 优点

  • 降低耦合
  • 集中管理逻辑
  • 易扩展

❌ 缺点

  • 中介者可能变"上帝类"
  • 逻辑过多集中

十一、什么时候使用中介者模式?

适合:

  • 多对象复杂交互
  • 对象之间依赖混乱
  • 需要集中控制

不适合:

  • 简单系统
  • 交互关系少

十二、一句话总结

中介者模式的本质是:
让对象不再直接通信,而是通过一个中心协调。

换句话说:

不要让对象"互相找",让它们"找中间人"。

相关推荐
geovindu2 小时前
go: Prototype Pattern
开发语言·设计模式·golang·原型模式
花间相见2 小时前
【Copilot配置】—— copilot-instructions.md vs AGENTS.md vs .instructions.md三种指令文件解析与配置
microsoft·copilot
我爱cope2 小时前
【从0开始学设计模式-11| 外观模式】
microsoft·设计模式·外观模式
两年半的个人练习生^_^2 小时前
每日一学:设计模式之代理模式
java·设计模式·代理模式
无籽西瓜a3 小时前
【西瓜带你学设计模式 | 第十九期 - 状态模式】状态模式 —— 状态流转与行为切换实现、优缺点与适用场景
java·后端·设计模式·状态模式·软件工程
llm大模型算法工程师weng3 小时前
Java面试核心突破:面向对象与设计模式
java·设计模式·面试
宝桥南山3 小时前
Azure - 尝试一下使用Azure Developer CLI去部署应用程序
microsoft·ai·微软·c#·aigc·azure
朱一头zcy3 小时前
设计模式入门:简单认识单例模式、模板方法、工厂模式、装饰模式、动态代理
java·设计模式
日拱一卒的小田3 小时前
ZYNQ学习笔记1-裸机-PS端中断配置、IO配置及PS/PL AXI交互(2-2)
笔记·学习·microsoft