中介者模式
中介者模式(Mediator Pattern)是一种行为设计模式,它允许对象之间通过一个中介对象进行通信,从而降低对象之间的直接依赖关系。这种模式适用于那些相互协作但又需要保持独立性的对象群体。
模式结构
中介者模式主要由以下几部分组成:
- Mediator(中介者):定义一个接口用于与各同事对象通信。
- ConcreteMediator(具体中介者):实现中介者接口,协调各个同事对象之间的交互,维持它们的状态。
- Colleague(同事):一个抽象类或接口,定义了与其他同事对象通信的方法。
- ConcreteColleague(具体同事):实现同事接口,每个具体同事只知道自己的行为,但不知道其他同事的行为。
工作原理
在中介者模式中,每个对象都通过与中介者通信来与其他对象交互,而不是直接与其他对象通信。这样,每个对象只需要知道中介者即可,不需要知道其他对象,从而降低了系统的复杂性。
当一个对象需要与其他对象交互时,它首先将消息发送给中介者,中介者再根据消息内容将消息转发给相应的对象。这样,对象之间的交互就被封装在中介者中,使得对象之间的耦合度降低。
优点
- 降低对象之间的耦合度:通过引入中介者,对象之间的直接依赖关系被消除,从而降低了系统的复杂性。
- 增强对象的复用性:由于对象之间不需要直接交互,因此可以更容易地复用对象。
- 简化对象之间的交互:对象只需要与中介者交互,而不需要与其他对象交互,从而简化了对象之间的交互。
- 提高系统的可扩展性:当需要增加新的对象时,只需要修改中介者即可,不需要修改其他对象。
缺点
- 中介者可能会变得过于复杂:当系统中对象较多时,中介者需要处理的对象之间的交互可能会变得非常复杂。
- 中介者可能成为系统的瓶颈:由于所有对象之间的交互都需要通过中介者,因此中介者可能会成为系统的性能瓶颈。
适用场景
- 对象之间存在复杂的交互关系:当对象之间的交互关系比较复杂时,可以使用中介者模式来简化对象之间的交互。
- 对象之间的依赖关系需要解耦:当对象之间的依赖关系需要解耦时,可以使用中介者模式来降低对象之间的耦合度。
- 需要提高系统的可扩展性:当需要提高系统的可扩展性时,可以使用中介者模式来实现。
示例代码
以下是一个简单的中介者模式的示例代码:
from abc import ABC, abstractmethod
# 中介者接口
class Mediator(ABC):
@abstractmethod
def send(self, message, colleague):
pass
# 具体中介者
class ConcreteMediator(Mediator):
def __init__(self):
self._colleague1 = None
self._colleague2 = None
def set_colleague1(self, colleague):
self._colleague1 = colleague
def set_colleague2(self, colleague):
self._colleague2 = colleague
def send(self, message, colleague):
if colleague == self._colleague1:
self._colleague2.notify(message)
else:
self._colleague1.notify(message)
# 同事接口
class Colleague(ABC):
def __init__(self, mediator):
self._mediator = mediator
@abstractmethod
def notify(self, message):
pass
# 具体同事
class ConcreteColleague1(Colleague):
def notify(self, message):
print(f"Colleague1 gets message: {message}")
class ConcreteColleague2(Colleague):
def notify(self, message):
print(f"Colleague2 gets message: {message}")
# 客户端代码
if __name__ == "__main__":
mediator = ConcreteMediator()
colleague1 = ConcreteColleague1(mediator)
colleague2 = ConcreteColleague2(mediator)
mediator.set_colleague1(colleague1)
mediator.set_colleague2(colleague2)
colleague1.notify("Hello, Colleague2!")
colleague2.notify("Hi, Colleague1!")
在这个示例中,我们定义了一个中介者接口和一个具体的中介者类,以及一个同事接口和两个具体的同事类。客户端代码创建了一个具体的中介者和两个具体的同事,并将它们关联起来。然后,通过中介者发送消息,使得两个同事之间可以进行通信。