🔄 回顧 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++ 實現:窗口控件協作系統
? 中介者接口
class Mediator {
public:virtual void notify(const std::string& sender, const std::string& event) = 0;virtual ~Mediator() = default;
};
? 具體同事類(Button & Textbox)
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";}
};
? 具體中介者
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();}}
};
? 使用示例
int main() {Button button;Textbox textbox;DialogMediator mediator(&button, &textbox);button.click();return 0;
}
輸出:
按鈕被點擊
文本框被清空
六、中介者常見應用場景總結
場景 | 中介者作用說明 |
---|---|
GUI 控件交互 | 統一管理按鈕、文本框、下拉框的協作邏輯 |
聊天室系統 | 聊天服務器作為中介,轉發各用戶消息 |
航空交通管制系統 | 塔臺協調各飛機起降調度 |
游戲多人房間管理 | 房主服務器協調玩家進入、退出、廣播消息 |
消息總線系統 | 各模塊通過事件總線解耦直接通信 |
七、優點與缺點總結
? 優點:
- 降低對象間耦合,每個對象只與中介者通信
- 集中管理交互邏輯,系統結構更清晰
- 便于擴展和維護(新增組件只需修改中介者)
? 缺點:
- 中介者自身可能變得非常復雜(上帝對象)
- 所有交互集中,壓力較大,需要合理設計拆分
八、中介者與觀察者/責任鏈的對比
模式 | 意圖 | 特點 |
---|---|---|
中介者 Mediator | 集中管理對象交互 | 主動協調,多對多交互集中處理 |
觀察者 Observer | 訂閱發布消息通知 | 事件驅動,廣播式通知 |
責任鏈 Chain | 傳遞請求鏈式處理 | 責任轉移,單線處理 |
九、面試回答模板
“我們在聊天系統中使用中介者模式,服務器作為中心節點協調所有客戶端消息,不讓客戶端之間直接通信。這樣新增客戶端、擴展功能都無需修改已有客戶端邏輯,只需修改服務器中介者邏輯,顯著降低系統耦合。”
? 建議強調:集中管理、降低耦合、支持擴展。
十、口訣記憶
“通信中有橋,獨立少煩惱;集中掌控流,系統易擴展。”
十一、明日預告:Day 18
備忘錄模式(Memento Pattern):保存對象內部狀態,實現撤銷與恢復功能,保護封裝性。