中介者模式(Mediator Pattern)是一种行为设计模式,它的主要目的是通过引入一个中介者对象来简化多个对象之间的交互,降低它们之间的耦合度。中介者模式使得这些对象可以通过中介者进行通信,而不需要直接相互引用,从而使得系统更加灵活和易于维护。
目的和意图
目的
- 减少对象之间的直接耦合:通过中介者对象来协调多个对象之间的交互,使得这些对象不需要直接引用彼此。
- 简化对象间的通信:对象只需要与中介者通信,而不需要知道其他对象的存在或如何与它们交互。
- 集中管理交互逻辑:将多个对象之间的交互逻辑集中到中介者中,使得交互逻辑更容易理解和管理。
意图
- 定义一个中介对象:中介者对象封装了对象之间的交互,使得对象之间的交互变得松散耦合。
- 促进松耦合:通过中介者,对象只与中介者耦合,而不是与多个其他对象耦合。
- 支持可扩展性:新的对象可以更容易地添加到系统中,而不需要修改现有的对象,只要它们与中介者进行交互。
适用场合
- 对象之间有复杂的引用关系:当系统中的对象之间存在复杂的引用关系,导致难以理解或维护时,可以使用中介者模式来简化这些关系。
- 需要控制对象之间的交互:当需要集中控制对象之间的交互逻辑时,中介者模式可以提供一个集中的地方来管理这些交互。
- 希望复用控制逻辑:如果多个场景需要类似的交互控制逻辑,可以将这些逻辑集中到中介者中,从而实现代码的复用。
- 对象间交互多变:当对象之间的交互可能随着需求的变化而变化时,中介者模式可以使得这些变化更容易管理。
中介者模式与外观模式的比较
相似点
- 抽象-layering:两者都旨在提供一个更高层次的抽象来简化与系统中一组对象的交互。
- 减少直接耦合:两者都试图减少系统中对象之间的直接耦合,通过引入一个新的对象来处理交互。
本质不同
-
目的不同:
- 中介者模式:主要目的是将多个对象之间的复杂交互逻辑集中到一个中介者对象中,以降低对象之间的耦合度,并使交互逻辑更易于管理和维护。
- 外观模式:主要目的是为子系统提供一个简化的接口,使得子系统的使用变得更加简单和直接,从而降低系统的复杂度。
-
角色不同:
- 中介者模式:包含中介者(Mediator)和同事(Colleague)对象,同事对象通过中介者进行交互。
- 外观模式:包含外观(Facade)和子系统(Subsystem)对象,外观对象提供了一个统一的接口来与子系统交互。
-
关注点不同:
- 中介者模式:关注于如何管理对象之间的交互,强调交互逻辑的集中管理。
- 外观模式:关注于如何简化子系统的接口,提供一个更易于使用的入口。
C++示例代码
以下是一个简单的C++示例,展示了中介者模式的应用。
场景
假设我们有一个简单的论坛系统,其中有多名用户可以发布帖子和回复。每个用户对象需要与其它用户交互,例如发送消息或接收消息。为了避免用户对象之间直接引用,我们可以引入一个中介者对象来管理这些交互。
实现
-
定义中介者接口
class Me