欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 中介者模式(Mediator Pattern)

中介者模式(Mediator Pattern)

2025/5/6 15:14:23 来源:https://blog.csdn.net/qq_42889517/article/details/147721455  浏览:    关键词:中介者模式(Mediator Pattern)

好的,我会更加详细地解释一下代码的每一部分,帮助你理解每个步骤。

我们来讲解**中介者模式(Mediator Pattern)**的实现。

🧠 中介者模式的背景和概念

  1. 问题场景
    假设我们有一个聊天室系统,多个用户发送消息给彼此。如果每个用户直接与其他用户通信,那么他们之间的相互关系会变得非常复杂。例如,若用户之间直接发送消息,我们就需要写很多代码来管理用户之间的交互,导致代码变得难以维护。

  2. 中介者模式的解决方案
    通过引入一个中介者,将所有的通信和协调都交给中介者来完成,而不是让各个对象直接相互依赖。中介者充当了所有对象间的桥梁,使得对象之间不直接联系,从而降低了系统的耦合度。


🎯 示例场景:聊天系统

在我们的示例中,我们有多个用户,每个用户都可以发送消息,而中介者(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 将这条消息转发给 BobCharlie
  • Bob 发送消息时,ChatRoom 将这条消息转发给 AliceCharlie
  • 最终,所有用户都能收到其他用户的消息。

🧭 类图(Mermaid)

管理用户
«interface»
Mediator
+send(message: str, colleague: Colleague)
ChatRoom
-users
+send(message: str, colleague: Colleague)
+add_user(user: Colleague)
Colleague
-name
-mediator
+send(message: str)
+receive(message: str)
  • Mediator 是一个接口,ChatRoom 类实现了 Mediator 接口,负责管理并转发消息。
  • Colleague 类表示聊天室中的用户。

🧭 流程图(Mermaid)

Alice Bob Charlie ChatRoom send("Hello, everyone!") receive("Hello, everyone!") receive("Hello, everyone!") send("Hi, Alice!") receive("Hi, Alice!") receive("Hi, Alice!") send("Hey all!") receive("Hey all!") receive("Hey all!") Alice Bob Charlie ChatRoom
  • ChatRoom 是中介者,负责接收和转发消息。
  • Alice, Bob, 和 CharlieColleague(同事),它们通过 send 方法发送消息,通过 receive 方法接收消息。

🧠 应用场景总结

场景示例
GUI事件处理用户界面中多个控件的交互,避免控件间复杂的互相调用
聊天系统多个用户之间的消息传递
工作流管理各个模块之间协调工作流执行
交通管理系统各交通信号灯之间的协调工作

总结口诀

中介者模式
✅ 通过一个中介者对象来协调多个对象之间的交互,解耦它们的直接依赖。
✅ 提供统一接口,便于扩展和维护。


如果你有其他更复杂的例子,或者需要与现实系统相结合的应用实例,随时可以告诉我,我可以继续扩展帮助你理解!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词