🔄 回顾 Day 16:责任链模式小结
在 Day 16 中,我们学习了责任链模式(Chain of Responsibility Pattern):
- 将请求沿链传递,节点可选择处理或传递下一节点。
- 实现了请求发送者与多个处理者的解耦,灵活构建处理流。
而今天的主题------中介者模式(Mediator Pattern),是进一步减少对象间直接依赖、简化系统复杂度的重要模式。
中介者模式:通过引入中介者对象,集中控制对象之间的交互,降低对象之间的耦合度。
中介者模式属于哪一类设计模式?
✅ 中介者模式属于行为型设计模式(Behavioral Pattern)!
为什么?
- 行为型模式主要关注对象之间的通信与职责分配。
- 中介者模式的本质是:组织、协调多个对象之间的行为交互。
- 它不负责创建对象(不是创建型),也不改变对象结构(不是结构型),而是优化对象如何交互。
对比总结:
分类 | 主要目的 | 中介者模式归属理由 |
---|---|---|
创建型模式 | 负责对象创建与实例化(如工厂、单例) | ❌ 中介者不负责创建对象 |
结构型模式 | 负责对象组合与组织(如适配器、桥接) | ❌ 中介者不改变对象静态结构 |
行为型模式 | 负责对象间通信与职责协作 | ✅ 中介者专注协调对象之间的交互关系 |
✅ 初学者记忆口诀:
"中介调行为,不管造结构。"
一、中介者模式的核心动机
在复杂系统中,对象与对象之间如果直接通信,会导致:
- 关系网越来越复杂(网状耦合)
- 难以维护与扩展(新增对象时需要修改大量类)
✅ 应用动机:
- GUI 窗口控件之间的联动
- 聊天室中多用户消息传递
- 航空交通管制系统中的飞机调度
引入中介者后:
- 对象不再直接通信,而是统一通过中介者转发、协调
- 系统结构变得清晰,交互逻辑集中管理
二、结构图(UML)
+----------------+
| Mediator |
+----------------+
| +notify(sender, event) |
+----------------+
/\
/ \
+----------------+ +----------------+
| ConcreteMediator | | Component |
+----------------+ +----------------+
/\
/ \
+----------------+ +----------------+
| Button | | Textbox |
+----------------+ +----------------+
三、角色说明
角色 | 职责描述 |
---|---|
Mediator | 中介者接口,统一协调对象交互 |
ConcreteMediator | 具体中介者,管理并协调各对象 |
Component | 具体同事对象,持有中介者引用,通过中介通信 |

四、C++ 实现:窗口控件协作系统
✅ 中介者接口
cpp
class Mediator {
public:
virtual void notify(const std::string& sender, const std::string& event) = 0;
virtual ~Mediator() = default;
};
✅ 具体同事类(Button & Textbox)
cpp
class Component {
protected:
Mediator* mediator_;
public:
void setMediator(Mediator* mediator) { mediator_ = mediator; }
virtual ~Component() = default;
};
class Button : public Component {
public:
void click() {
std::cout << "按钮被点击\n";
mediator_->notify("Button", "click");
}
};
class Textbox : public Component {
public:
void clear() {
std::cout << "文本框被清空\n";
}
};
✅ 具体中介者
cpp
class DialogMediator : public Mediator {
Button* button_;
Textbox* textbox_;
public:
DialogMediator(Button* btn, Textbox* tb) : button_(btn), textbox_(tb) {
button_->setMediator(this);
textbox_->setMediator(this);
}
void notify(const std::string& sender, const std::string& event) override {
if (sender == "Button" && event == "click") {
textbox_->clear();
}
}
};
✅ 使用示例
cpp
int main() {
Button button;
Textbox textbox;
DialogMediator mediator(&button, &textbox);
button.click();
return 0;
}
输出:
按钮被点击
文本框被清空
五、中介者常见应用场景总结
场景 | 中介者作用说明 |
---|---|
GUI 控件交互 | 统一管理按钮、文本框、下拉框的协作逻辑 |
聊天室系统 | 聊天服务器作为中介,转发各用户消息 |
航空交通管制系统 | 塔台协调各飞机起降调度 |
游戏多人房间管理 | 房主服务器协调玩家进入、退出、广播消息 |
消息总线系统 | 各模块通过事件总线解耦直接通信 |
六、优点与缺点总结
✅ 优点:
- 降低对象间耦合,每个对象只与中介者通信
- 集中管理交互逻辑,系统结构更清晰
- 便于扩展和维护(新增组件只需修改中介者)
❗ 缺点:
- 中介者自身可能变得非常复杂(上帝对象)
- 所有交互集中,压力较大,需要合理设计拆分
七、中介者与观察者/责任链的对比
模式 | 意图 | 特点 |
---|---|---|
中介者 Mediator | 集中管理对象交互 | 主动协调,多对多交互集中处理 |
观察者 Observer | 订阅发布消息通知 | 事件驱动,广播式通知 |
责任链 Chain | 传递请求链式处理 | 责任转移,单线处理 |
八、面试回答模板
"我们在聊天系统中使用中介者模式,服务器作为中心节点协调所有客户端消息,不让客户端之间直接通信。这样新增客户端、扩展功能都无需修改已有客户端逻辑,只需修改服务器中介者逻辑,显著降低系统耦合。"
✅ 建议强调:集中管理、降低耦合、支持扩展。
九、口诀记忆
"通信中有桥,独立少烦恼;集中掌控流,系统易扩展。"
十、明日预告:Day 18
备忘录模式(Memento Pattern):保存对象内部状态,实现撤销与恢复功能,保护封装性。