中介者模式是一种软件设计模式,它通过引入一个中介对象来封装一组对象之间的交互。这种模式可以帮助实现对象间的解耦,使得对象之间的依赖关系变得更松散,从而提高了系统的灵活性和可维护性。与外观模式不同,中介者模式更注重于处理对象之间的通信,而不是简化对象的接口。
本文目录导读:
在面向对象的设计中,对象之间的交互是至关重要的,为了实现对象之间的解耦和通信,我们常常使用一些设计模式,中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个中介者对象来封装一组对象的交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,本文将详细介绍中介者模式的概念、结构、实现方式以及优缺点。
中介者模式概念
中介者模式定义了一种一对多的依赖关系,让多个对象之间的交互由一个中介者对象负责管理,当对象之间需要相互通信时,不直接调用对方的方法,而是将消息发送给中介者,由中介者根据需要选择合适的对象进行处理。
中介者模式结构
中介者模式包含以下四个角色:
1、抽象中介者(Mediator):定义了对象之间的交互接口,维护一个对象列表,提供注册、注销、获取等方法。
2、具体中介者(ConcreteMediator):实现抽象中介者定义的方法,处理对象之间的交互。
3、抽象同事类(Colleague):定义了对象之间的交互接口,实现自己的业务逻辑。
4、具体同事类(ConcreteColleague):实现抽象同事类定义的方法,与其他对象进行交互。
中介者模式实现方式
以下是一个简单的中介者模式实现示例:
from abc import ABC, abstractmethod class Mediator(ABC): @abstractmethod def send(self, message: str, colleague: 'Colleague') -> None: pass @abstractmethod def register(self, colleague: 'Colleague') -> None: pass @abstractmethod def unregister(self, colleague: 'Colleague') -> None: pass class ConcreteMediator(Mediator): def __init__(self): self.colleagues = [] def send(self, message: str, colleague: 'Colleague') -> None: for colleague in self.colleagues: if colleague != colleague: colleague.receive(message) def register(self, colleague: 'Colleague') -> None: self.colleagues.append(colleague) def unregister(self, colleague: 'Colleague') -> None: self.colleagues.remove(colleague) class Colleague(ABC): @abstractmethod def send(self, message: str) -> None: pass @abstractmethod def receive(self, message: str) -> None: pass class ConcreteColleagueA(Colleague): def __init__(self, mediator: 'ConcreteMediator'): self.mediator = mediator self.mediator.register(self) def send(self, message: str) -> None: print(f'ColleagueA: {message}') self.mediator.send(message, self) def receive(self, message: str) -> None: print(f'ColleagueA received: {message}') class ConcreteColleagueB(Colleague): def __init__(self, mediator: 'ConcreteMediator'): self.mediator = mediator self.mediator.register(self) def send(self, message: str) -> None: print(f'ColleagueB: {message}') self.mediator.send(message, self) def receive(self, message: str) -> None: print(f'ColleagueB received: {message}') if __name__ == '__main__': mediator = ConcreteMediator() colleague_a = ConcreteColleagueA(mediator) colleague_b = ConcreteColleagueB(mediator) colleague_a.send('Hello, ColleagueB!') colleague_b.send('Hi, ColleagueA!')
中介者模式优缺点
1、优点:
- 降低了对象之间的耦合度:对象之间的交互由中介者对象统一管理,不需要显式地相互引用。
- 提高了对象之间的解耦度:对象只依赖于中介者,不需要关心其他对象的具体实现。
- 简化了对象之间的交互:对象只需要将消息发送给中介者,由中介者选择合适的对象进行处理。
- 支持扩展:新的对象可以很容易地加入到系统中,只需要实现同事类的接口即可。
2、缺点:
- 增加了系统的复杂性:引入中介者对象后,系统的结构变得更加复杂。
- 中介者对象容易成为系统的瓶颈:如果所有的对象都依赖于中介者,那么中介者对象的性能和可用性将直接影响整个系统。