中介者模式
中介者模式
本文介绍中介者模式定义、结构、特点、适用场景、代码实现。
中介者模式
1 模式的定义
中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
2 模式的结构
2.1 结构图
2.2 参与者
- Mediator: 抽象中介者。定义一个接口,该接口用于与各同事对象之间的通信。
- ConcreteMediator:具体中介者。是抽象中介者的子类,通过协调各个同事对象来实现协作行为,了解并维护它的各个同事对象的引用。
- Colleague:抽象同事类。定义各同事的公有方法。
- ConcreteColleague:具体同事类。是抽象同事类的子类,每一个同事对象都引用一个中介者对象,
3 模式分析
3.1 优点
- 单一职责原则。你可以将多个组件间的交流抽取到同一位置,使其更易于理解和维护。
- 开闭原则。你无需修改实际组件就能增加新的中介者。
- 你可以减轻应用中多个组件间的耦合情况。
- 你可以更方便地复用各个组件。
3.2 缺点
- 在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
4 适用环境
- 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
- 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
- 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象。
- 交互的公共行为,如果需要改变行为则可以增加新的中介者类。
5 实现方式
- 找到一组当前紧密耦合,且提供其独立性能带来更大好处的类(例如更易于维护或更方便复用)。
- 声明中介者接口并描述中介者和各种组件之间所需的交流接口。在绝大多数情况下,一个接收组件通知的方法就足够了。如果你希望在不同情景下复用组件类,那么该接口将非常重要。只要组件使用通用接口与其中介者合作,你就能将该组件与不同实现中的中介者进行连接。
- 实现具体中介者类。该类可从自行保存其下所有组件的引用中受益。
- 你可以更进一步,让中介者负责组件对象的创建和销毁。此后,中介者可能会与工厂或外观类似。
- 组件必须保存对于中介者对象的引用。该连接通常在组件的构造函数中建立,该函数会将中介者对象作为参数传递。
- 修改组件代码,使其可调用中介者的通知方法,而非其他组件的方法。然后将调用其他组件的代码抽取到中介者类中,并在中介者接收到该组件通知时执行这些代码。
6 代码实现
https://github.com/august295/DesignPatternCode
参考
[1] https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/mediator.html
本文由作者按照 CC BY 4.0 进行授权