好的,我会更加详细地解释一下代码的每一部分,帮助你理解每个步骤。
我们来讲解**中介者模式(Mediator Pattern)**的实现。
🧠 中介者模式的背景和概念
-
问题场景:
假设我们有一个聊天室系统,多个用户发送消息给彼此。如果每个用户直接与其他用户通信,那么他们之间的相互关系会变得非常复杂。例如,若用户之间直接发送消息,我们就需要写很多代码来管理用户之间的交互,导致代码变得难以维护。 -
中介者模式的解决方案:
通过引入一个中介者,将所有的通信和协调都交给中介者来完成,而不是让各个对象直接相互依赖。中介者充当了所有对象间的桥梁,使得对象之间不直接联系,从而降低了系统的耦合度。
🎯 示例场景:聊天系统
在我们的示例中,我们有多个用户,每个用户都可以发送消息,而中介者(ChatRoom
)负责转发用户的消息给其他所有用户。这样,用户之间就不需要知道彼此的存在,所有的消息交互都通过中介者来完成。
🧩 代码讲解
1️⃣ 中介者接口(Mediator)
from abc import ABC, abstractmethodclass Mediator(ABC):@abstractmethoddef send(self, message: str, colleague: 'Colleague'):pass
-
这个接口定义了一个方法
send
,它用来发送消息。send
方法需要两个参数:message
:发送的消息内容。colleague
:发送消息的用户(即发送者)。
2️⃣ 具体中介者(ChatRoom)
class ChatRoom(Mediator):def __init__(self):self.users = [] # 存储聊天室中的所有用户def add_user(self, user: Colleague):self.users.append(user) # 添加用户到聊天室def send(self, message: str, colleague: 'Colleague'):# 遍历所有的用户,将消息发送给每个用户,除了发送消息的用户自己for user in self.users:if user != colleague:user.receive(message) # 调用用户的 `receive` 方法来接收消息
-
ChatRoom
类是中介者的具体实现。它有两个方法:add_user
:将一个用户添加到聊天室。send
:发送消息给所有的用户,除了消息的发送者。
3️⃣ 同事类(Colleague)
class Colleague:def __init__(self, name, mediator: Mediator):self.name = nameself.mediator = mediator # 通过构造函数注入中介者def send(self, message: str):print(f"{self.name} sends: {message}")self.mediator.send(message, self) # 调用中介者的 `send` 方法来发送消息(除了自己以外,都发送)def receive(self, message: str):print(f"{self.name} received: {message}") # 显示接收到的消息
-
Colleague
类代表聊天室中的用户。每个用户通过中介者与其他用户交互:send
:用户发送消息,通过中介者的send
方法传递消息。receive
:用户接收来自中介者转发的消息。
4️⃣ 客户端代码:模拟聊天过程
# 创建一个聊天室
chat_room = ChatRoom()# 创建用户并添加到聊天室
user1 = Colleague("Alice", chat_room)
user2 = Colleague("Bob", chat_room)
user3 = Colleague("Charlie", chat_room)chat_room.add_user(user1) # 添加用户 Alice
chat_room.add_user(user2) # 添加用户 Bob
chat_room.add_user(user3) # 添加用户 Charlie# 用户发送消息
user1.send("Hello, everyone!") # Alice 发送消息
user2.send("Hi, Alice!") # Bob 发送消息
user3.send("Hey all!") # Charlie 发送消息
- 我们创建了一个
ChatRoom
中介者并将三个用户(Alice, Bob, Charlie)添加到聊天室。 - 每个用户通过
send
方法向聊天室发送消息,聊天室会将消息转发给其他所有用户。
✅ 输出结果
Alice sends: Hello, everyone!
Bob received: Hello, everyone!
Charlie received: Hello, everyone!
Bob sends: Hi, Alice!
Alice received: Hi, Alice!
Charlie received: Hi, Alice!
Charlie sends: Hey all!
Alice received: Hey all!
Bob received: Hey all!
- 当
Alice
发送消息时,ChatRoom
将这条消息转发给Bob
和Charlie
。 - 当
Bob
发送消息时,ChatRoom
将这条消息转发给Alice
和Charlie
。 - 最终,所有用户都能收到其他用户的消息。
🧭 类图(Mermaid)
Mediator
是一个接口,ChatRoom
类实现了Mediator
接口,负责管理并转发消息。Colleague
类表示聊天室中的用户。
🧭 流程图(Mermaid)
ChatRoom
是中介者,负责接收和转发消息。Alice
,Bob
, 和Charlie
是Colleague
(同事),它们通过send
方法发送消息,通过receive
方法接收消息。
🧠 应用场景总结
场景 | 示例 |
---|---|
GUI事件处理 | 用户界面中多个控件的交互,避免控件间复杂的互相调用 |
聊天系统 | 多个用户之间的消息传递 |
工作流管理 | 各个模块之间协调工作流执行 |
交通管理系统 | 各交通信号灯之间的协调工作 |
✅ 总结口诀
中介者模式:
✅ 通过一个中介者对象来协调多个对象之间的交互,解耦它们的直接依赖。
✅ 提供统一接口,便于扩展和维护。
如果你有其他更复杂的例子,或者需要与现实系统相结合的应用实例,随时可以告诉我,我可以继续扩展帮助你理解!