模式特点
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
- 将网状的多对多交互变为星型的一对多交互
- 集中管理组件间的通信逻辑
- 降低同事类之间的耦合度
- 便于修改和扩展交互规则
类图
应用场景
- Qt 信号槽机制:Qobject 充当中介者协调组件通信
- 示教器界面协调:运动面板、IO 面板、安全面板之间的联动
- 聊天室系统:服务器作为中介者转发消息
- 空中交通管制系统:塔台协调多架飞机
- MVC 架构中 Controller 作为 Model 和 View 的中介者
示例代码(C++)
class Mediator; // 同事基类 class Module { protected: Mediator* m_mediator; public: Module(Mediator* m) : m_mediator(m) {} virtual ~Module() = default; }; // 中介者 class Mediator { public: Module* motionPanel = nullptr; Module* safetyPanel = nullptr; virtual void notify(Module* sender, const std::string& event) = 0; virtual ~Mediator() = default; }; // 运动面板 class MotionPanel : public Module { public: MotionPanel(Mediator* m) : Module(m) {} void startMove() { m_mediator->notify(this, "开始运动"); } void onStop() { std::cout << "[运动面板] 停止运动" << std::endl; } }; // 安全面板 class SafetyPanel : public Module { public: SafetyPanel(Mediator* m) : Module(m) {} void onMoveStart() { std::cout << "[安全面板] 监控运动开始" << std::endl; } void triggerStop() { m_mediator->notify(this, "紧急停止"); } }; // 具体中介者 class RobotMediator : public Mediator { MotionPanel* motion; SafetyPanel* safety; public: void notify(Module* sender, const std::string& event) override { if (event == "开始运动") safety->onMoveStart(); else if (event == "紧急停止") motion->onStop(); } };