中介者模式(Mediator Pattern)是一种行为型设计模式,它定义了一个对象(中介者)来封装对象之间的交互。中介者通过调度其他对象之间的通信,避免对象之间的直接引用,从而使得对象之间的耦合松散。中介者模式使得对象之间的交互变得更加灵活和可维护。
中介者模式的结构
中介者模式主要包括以下几个角色:
- 中介者接口(Mediator):定义与同事对象(Colleague)通信的接口。
- 具体中介者(ConcreteMediator):实现中介者接口,协调各个同事对象之间的交互。
- 同事对象(Colleague):各个参与交互的对象,持有对中介者对象的引用,通过中介者与其他同事对象通信。
中介者模式的示例
假设我们有一个聊天室系统,不同的用户通过聊天室发送消息。我们可以使用中介者模式来实现这一需求。
定义中介者接口
from abc import ABC, abstractmethod
class Mediator(ABC):
@abstractmethod
def send_message(self, message: str, colleague):
pass
定义具体中介者
class ChatRoomMediator(Mediator):
def __init__(self):
self.colleagues = []
def add_colleague(self, colleague):
self.colleagues.append(colleague)
def send_message(self, message: str, sender):
for colleague in self.colleagues:
if colleague != sender:
colleague.receive_message(message)
定义同事对象
class Colleague(ABC):
def __init__(self, mediator: Mediator, name: str):
self.mediator = mediator
self.name = name
@abstractmethod
def send_message(self, message: str):
pass
@abstractmethod
def receive_message(self, message: str):
pass
class User(Colleague):
def send_message(self, message: str):
print(f"{self.name} sends: {message}")
self.mediator.send_message(message, self)
def receive_message(self, message: str):
print(f"{self.name} receives: {message}")
使用中介者模式
def main():
mediator = ChatRoomMediator()
user1 = User(mediator, "User1")
user2 = User(mediator, "User2")
user3 = User(mediator, "User3")
mediator.add_colleague(user1)
mediator.add_colleague(user2)
mediator.add_colleague(user3)
user1.send_message("Hello everyone!")
user2.send_message("Hi User1!")
user3.send_message("Hey!")
if __name__ == "__main__":
main()
在这个示例中,Mediator
是中介者接口,定义了发送消息的方法。ChatRoomMediator
是具体中介者,实现了中介者接口,负责协调用户之间的消息传递。Colleague
是同事对象的抽象类,定义了发送和接收消息的方法。User
是具体同事对象,实现了发送和接收消息的方法。客户端通过创建中介者和用户对象,使用中介者模式实现聊天室的消息传递。
中介者模式的优缺点
优点
- 降低耦合:中介者模式通过引入中介者对象,使同事对象之间不再直接引用,降低了对象之间的耦合。
- 提高灵活性:中介者模式使得对象之间的交互变得更加灵活,可以动态地改变对象之间的交互方式。
- 集中控制交互:中介者对象集中控制对象之间的交互,使得对象之间的交互逻辑更加清晰和可维护。
缺点
- 中介者复杂性增加:随着同事对象之间交互的增加,中介者对象可能会变得复杂,难以维护。
- 可能产生性能瓶颈:由于中介者集中管理所有交互,可能会成为系统的性能瓶颈。
中介者模式的适用场景
- 复杂对象交互:当系统中对象之间的交互复杂且难以维护时,可以使用中介者模式。
- 减少类间依赖:当需要减少类之间的依赖关系,降低耦合度时,可以使用中介者模式。
- 动态改变交互:当需要在运行时动态改变对象之间的交互方式时,可以使用中介者模式。
总结
中介者模式是一种行为型设计模式,通过定义一个中介者对象来封装对象之间的交互,避免对象之间的直接引用,从而降低对象之间的耦合。中介者模式适用于复杂对象交互、减少类间依赖和动态改变交互的场景。合理应用中介者模式,可以提高系统的灵活性和可维护性。理解并掌握中介者模式,有助于在实际开发中构建高效、灵活的系统。