漫谈设计模式 [16]:中介者模式
引导性开场
菜鸟:老鸟,我最近在开发一个聊天应用的时候遇到了点问题。每个用户都需要与其他用户直接通信,这让我在代码中写了很多复杂的逻辑来管理这些联系。这样下去,代码越来越难维护了。你有什么建议吗?
老鸟:嗯,这确实是个常见的问题。你有没有听说过中介者模式?
菜鸟:中介者模式?没听过。它能解决我现在的问题吗?
老鸟:绝对可以。让我给你详细解释一下。
渐进式介绍概念
老鸟:我们可以用一个简单的生活例子来理解中介者模式。想象一下,你在一个公司工作,公司里有很多同事。如果每个同事都需要直接和其他所有同事沟通,整个沟通过程会非常混乱,对吧?
菜鸟:对啊,人越多越难管理。
老鸟:所以,公司通常会有一个中介——比如一个经理。所有的沟通都通过经理来进行。同事A想和同事B沟通,他只需要告诉经理,经理再去通知同事B。这样,沟通就变得简单和有序了。这就是中介者模式的核心思想。
菜鸟:哦,我明白了。中介者模式是通过一个中介来简化对象之间的通信。
Python代码示例,逐步展开
老鸟:让我们通过一个简单的 Python 示例来进一步理解吧。
基础实现
老鸟:首先,我们来看看没有中介者模式的实现。假设我们有两个用户,每个用户都可以直接向另一个用户发送消息。
class User:
def __init__(self, name):
self.name = name
self.contacts = []
def add_contact(self, user):
self.contacts.append(user)
def send_message(self, message, to_user):
print(f"{self.name} sends message to {to_user.name}: {message}")
to_user.receive_message(message, self)
def receive_message(self, message, from_user):
print(f"{self.name} received message from {from_user.name}: {message}")
# 创建用户
alice = User("Alice")
bob = User("Bob")
# 添加联系人
alice.add_contact(bob)
bob.add_contact(alice)
# 发送消息
alice.send_message("Hello, Bob!", bob)
bob.send_message("Hi, Alice!", alice)
菜鸟:这样每个用户都需要知道其他用户的存在,这确实不太好。
老鸟:没错,现在我们来引入中介者模式。
引入中介者模式
老鸟:我们创建一个 ChatRoom
类作为中介者,让所有用户通过 ChatRoom
来通信。
class ChatRoom:
def show_message(self, user, message):
print(f"{user.name} says: {message}")
class User:
def __init__(self, name, chatroom):
self.name = name
self.chatroom = chatroom
def send_message(self, message):
self.chatroom.show_message(self, message)
# 创建中介者
chatroom = ChatRoom()
# 创建用户
alice = User("Alice", chatroom)
bob = User("Bob", chatroom)
# 发送消息
alice.send_message("Hello, Bob!")
bob.send_message("Hi, Alice!")
菜鸟:这样看起来确实更简洁了。用户只需要知道 ChatRoom
,而不需要直接引用其他用户。
问题与反思
菜鸟:可是,如果我想在发送消息时包含一些业务逻辑,比如对某些消息进行过滤,该怎么办?
老鸟:好问题。你可以在 ChatRoom
中添加相应的逻辑,这样所有的消息处理都集中在一个地方,代码更容易维护和扩展。
class ChatRoom:
def show_message(self, user, message):
if self.message_filter(message):
print(f"{user.name} says: {message}")
else:
print(f"Message from {user.name} was blocked.")
def message_filter(self, message):
# 简单的示例过滤器
return "spam" not in message.lower()
# 使用新的 ChatRoom
chatroom = ChatRoom()
alice = User("Alice", chatroom)
bob = User("Bob", chatroom)
alice.send_message("Hello, Bob!")
bob.send_message("This is spam message.")
菜鸟:明白了,这样我就可以在 ChatRoom
中集中处理所有的业务逻辑了。
优势与适用场景
老鸟:中介者模式有很多优势。它可以减少对象之间的耦合,使系统更易于扩展和维护。适用于对象之间有复杂交互的情况,比如聊天系统、GUI组件之间的通信等等。
菜鸟:明白了,这样在需要扩展用户数量或者添加新功能的时候,就不需要修改每个用户的代码了。
常见误区与优化建议
老鸟:不过要注意,不要把所有的逻辑都塞到中介者里,否则中介者会变得过于复杂。可以通过拆分中介者或引入其他设计模式来保持代码的清晰和简洁。
菜鸟:好的,我会注意的。
总结与延伸阅读
老鸟:总结一下,中介者模式通过引入一个中介者对象,来简化对象之间的通信和交互。它有助于减少对象之间的耦合,使系统更容易扩展和维护。你可以查阅《设计模式:可复用面向对象软件的基础》这本书,里面有更多设计模式的详细解释。
菜鸟:谢谢老鸟,我会去读一读的。下次我还想学习其他设计模式,你有什么推荐吗?
老鸟:你可以先了解一下观察者模式和策略模式,这两个模式也非常常用而且很有趣。
菜鸟:好的,我会去研究一下的。再次感谢!