中介者模式的核心思想
中介者模式(Mediator Pattern)属于行为型设计模式,旨在减少对象之间的直接耦合,通过引入一个中介对象来协调多个对象之间的交互。该模式的核心思想是将复杂的网状依赖关系转化为星型结构,使对象间的通信集中在中介者上,从而提升代码的可维护性和扩展性。
适用场景
- 对象之间存在大量复杂的相互依赖关系,导致代码难以维护。
- 需要动态调整对象间的交互逻辑,而不希望直接修改每个相关对象。
- 多个对象需要共享行为,但又不适合通过继承实现。
模式结构
- Mediator(中介者接口):定义对象间通信的抽象方法。
- ConcreteMediator(具体中介者):实现中介者接口,协调各具体对象的行为。
- Colleague(同事类):定义对象的通用接口,通常包含对中介者的引用。
- ConcreteColleague(具体同事类):实现同事类接口,与其他同事类通过中介者交互。
C++20 实现示例
以下是一个基于现代 C++(C++20)的中介者模式实现,使用智能指针和模板优化设计:
#include <iostream>
#include <memory>
#include <vector>
#include <string>
// 前置声明
class Colleague;
// 中介者抽象接口
class Mediator {
public:
virtual void notify(std::shared_ptr<Colleague> sender, const std::string& event) = 0;
virtual ~Mediator() = default;
};
// 同事类抽象基类
class Colleague {
protected:
std::shared_ptr<Mediator> mediator_;
public:
explicit Colleague(std::shared_ptr<Mediator> mediator) : mediator_(mediator) {}
virtual void send(const std::string& event) = 0;
virtual void receive(const std::string& event) = 0;
virtual ~Colleague() = default;
};
// 具体中介者
class ConcreteMediator : public Mediator, public std::enable_shared_from_this<ConcreteMediator> {
private:
std::vector<std::shared_ptr<Colleague>> colleagues_;
public:
void addColleague(std::shared_ptr<Colleague> colleague) {
colleagues_.push_back(colleague);
}
void notify(std::shared_ptr<Colleague> sender, const std::string& event) override {
for (const auto& colleague : colleagues_) {
if (colleague != sender) {
colleague->receive(event);
}
}
}
};
// 具体同事类
class ConcreteColleague : public Colleague {
private:
std::string name_;
public:
ConcreteColleague(std::shared_ptr<Mediator> mediator, const std::string& name)
: Colleague(mediator), name_(name) {}
void send(const std::string& event) override {
std::cout << name_ << " sends: " << event << std::endl;
mediator_->notify(shared_from_this(), event);
}
void receive(const std::string& event) override {
std::cout << name_ << " receives: " << event << std::endl;
}
};
int main() {
auto mediator = std::make_shared<ConcreteMediator>();
auto colleague1 = std::make_shared<ConcreteColleague>(mediator, "Colleague1");
auto colleague2 = std::make_shared<ConcreteColleague>(mediator, "Colleague2");
mediator->addColleague(colleague1);
mediator->addColleague(colleague2);
colleague1->send("Hello from Colleague1!");
colleague2->send("Hi from Colleague2!");
return 0;
}
关键优化点
- 智能指针管理生命周期:使用
std::shared_ptr避免手动内存管理,确保资源安全释放。 - C++20 的
std::enable_shared_from_this:解决中介者与同事类之间的循环引用问题。 - 事件驱动设计:通过
notify和receive方法实现松耦合通信。
模式优缺点
优点
- 减少对象间的直接依赖,简化交互逻辑。
- 集中控制交互行为,便于扩展和维护。
- 符合迪米特法则(最少知识原则)。
缺点
- 中介者可能成为单点故障,复杂性会随交互逻辑增加。
- 过度使用可能导致中介者类过于庞大。
实际应用案例
- GUI 框架:窗口组件(按钮、文本框)通过中介者(如对话框)协调交互。
- 聊天系统:用户通过聊天室中介者发送和接收消息。
- 游戏开发:角色与道具的交互通过游戏引擎中介者管理。
通过合理使用中介者模式,可以显著提升代码的可维护性和灵活性,尤其在复杂交互场景中表现突出。

被折叠的 条评论
为什么被折叠?



