设计模式汇总:查看
通俗示例
想象一下你正在参与一个团队项目,团队成员包括设计师、前端开发者、后端开发者、测试工程师等。每个团队成员都需要与其他成员沟通协作,比如设计师完成设计后需要通知前端开发者开始开发,前端开发者完成后需要通知测试工程师进行测试。如果每个团队成员都直接与其他所有团队成员沟通,那么沟通线路会变得非常复杂。为了简化这个过程,团队可以引入一个项目经理的角色,所有团队成员只与项目经理沟通,由项目经理来协调不同成员之间的工作。这里的项目经理就是中介者模式中的中介者,他帮助降低了团队成员之间沟通的复杂性。
通俗解释
中介者模式是一种行为型设计模式,它的主要目的是通过引入一个中介者对象来降低多个对象或类之间的通信复杂性。在中介者模式中,各个对象不再直接相互通信,而是通过中介者对象来进行通信。这样,各个对象只需要知道如何与中介者交互,而无需了解其他对象的具体信息,从而降低了系统中的耦合度。
中介者模式的组成包括以下几部分:
- 中介者(Mediator)接口:定义了各个同事对象之间交互的接口。
- 具体中介者(Concrete Mediator):实现了中介者接口,并协调各个同事对象之间的交互。
- 同事(Colleague)类:一个抽象类或接口,定义了同事对象的通用方法,通常包含对中介者对象的引用。
- 具体同事(Concrete Colleague)类:实现了同事接口,并具体实现各种业务逻辑。
中介者模式的优点
- 降低对象之间的耦合度:对象之间不需要显式地相互引用,降低了它们之间的依赖关系。
- 提高系统的可维护性:由于对象之间的交互都通过中介者进行,因此修改一个对象时不需要修改其他对象。
- 简化对象之间的交互:对象之间不需要了解对方的实现细节,只需要与中介者交互。
Python代码示例
以下是一个中介者模式的简单实现:
# 中介者接口
class Mediator:
def send(self, message, colleague):
pass
# 具体中介者
class ConcreteMediator(Mediator):
def __init__(self):
self._colleagues = []
def add_colleague(self, colleague):
self._colleagues.append(colleague)
def send(self, message, colleague):
for col in self._colleagues:
if col != colleague:
col.receive(message)
# 同事类
class Colleague:
def __init__(self, mediator, name):
self._mediator = mediator
self.name = name
def send(self, message):
self._mediator.send(message, self)
def receive(self, message):
pass
# 具体同事类
class ConcreteColleague(Colleague):
def receive(self, message):
print(f"{self.name} received message: {message}")
# 客户端代码
if __name__ == "__main__":
# 创建中介者
mediator = ConcreteMediator()
# 创建同事对象
jack = ConcreteColleague(mediator, "Jack")
Tom = ConcreteColleague(mediator, "Tom")
Mery = ConcreteColleague(mediator, "Mery")
# 将同事对象注册到中介者
mediator.add_colleague(jack)
mediator.add_colleague(Tom)
mediator.add_colleague(Mery)
# 同事之间通过中介者发送消息
jack.send("Hello, Colleagues!")
在这个例子中,Mediator
是中介者接口,ConcreteMediator
是具体中介者类,负责协调同事对象之间的通信。Colleague
是同事类,ConcreteColleague
是具体同事类,实现了接收消息的方法。客户端代码创建了中介者和同事对象,并将同事对象注册到中介者中。当同事对象发送消息时,中介者会将消息转发给其他所有同事对象。
总结
中介者模式通过引入中介者对象,实现了对象之间通信的解耦,使得对象之间的交互更加简单、清晰。它适用于那些对象之间通信复杂、且难以跟踪和维护的场景。通过中介者模式,我们可以提高系统的模块化和可维护性。