設計模式每日硬核訓練 Day 17:中介者模式(Mediator Pattern)完整講解與實戰應用

🔄 回顧 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):保存對象內部狀態,實現撤銷與恢復功能,保護封裝性。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79664.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79664.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79664.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何提升個人情商?

引言 提升個人情商&#xff08;EQ&#xff09;是一個持續的自我修煉過程&#xff0c;涉及自我認知、情緒管理、人際溝通等多個方面。以下是一些具體且可實踐的方法&#xff0c;幫助你逐步提升情商&#xff1a; 一、提升自我覺察能力 1. 記錄情緒日記 每天回顧自己的情緒…

STM32Cube-FreeRTOS任務調度與任務管理-筆記

STM32Cube-FreeRTOS任務調度與任務管理-筆記 一、任務調度機制1.1 調度算法類型 二、搶占式調度實現與分析2.1 時間片輪轉機制2.2 調度觸發條件2.3 搶占式調度例子 三、合作式調度實現3.1 核心邏輯3.1 合作式調度例子 四、任務管理函數詳解4.1 任務創建4.1.1 動態創建任務4.1.2…

對稱加密算法(AES、ChaCha20和SM4)Python實現——密碼學基礎(Python出現No module named “Crypto” 解決方案)

文章目錄 一、對稱加密算法基礎1.1 對稱加密算法的基本原理1.2 對稱加密的主要工作模式 二、AES加密算法詳解2.1 AES基本介紹2.2 AES加密過程2.3 Python中實現AES加密Python出現No module named “Crypto” 解決方案 2.4 AES的安全考量 三、ChaCha20加密算法3.1 ChaCha20基本介…

MATLAB圖像加密案例

下面是一個使用 MATLAB 編寫的簡單圖像塊置亂加密/解密程序,主要利用了函數來組織代碼。 這個程序通過將圖像分割成小塊,然后根據一個密鑰(用于隨機數生成器種子)打亂這些塊的順序來實現加密。解密過程則使用相同的密鑰恢復原始塊順序。 核心思想: 分塊: 將圖像劃分為 …

阿里云服務器全棧技術指導手冊(2025版)

阿里云服務器全棧技術指導手冊&#xff08;2025版&#xff09; 一、基礎配置與核心架構設計 1. 精準實例選型策略 ? 通用計算場景&#xff1a;選擇ECS通用型&#xff08;如ecs.g7&#xff09;實例&#xff0c;搭載第三代Intel Xeon處理器&#xff0c;適合Web應用、中小型數…

word批量轉pdf工具

word批量轉pdf工具 圖片 說到了辦公&#xff0c;怎能不提PDF轉換哦&#xff1f; 這是一款一鍵就可以批量word轉換為PDF的小工具&#xff0c;簡直是VB界的一股清流。 圖片 操作簡單到不行&#xff0c;只要把需要轉換的word文件和這個工具放在同一個文件夾里&#xff0c;雙擊…

C++類_協變返回類型

協變返回類型定義 在 C11 中&#xff0c;協變返回類型是指在基類和派生類的虛函數重寫時&#xff0c;派生類中重寫的虛函數的返回類型可以是基類中對應虛函數返回類型的派生類型。也就是說&#xff0c;當基類的虛函數返回一個基類指針或引用時&#xff0c;派生類中重寫該虛函數…

補充:建立實體類與數據表的映射關系

目錄 前言 1 成員變量數據類型和字段類型 保持對應 2 成員變量的變量名&#xff0c;應采用小駝峰命名法 3 數據表中的主鍵如id 應采用自增方式 4 數據表中的時間類型數據與實體類中的時間類型的變量無法實現自動映射可以使用JsonFormat 注解 4.1 配置全局時間處理器&#x…

HTML/CSS 魔法第二彈:會逃跑的調皮按鈕(懸停自動閃避)

引言 在網頁設計中&#xff0c;交互性是吸引用戶的關鍵因素之一。普通的按鈕在用戶懸停時可能只是顏色或樣式發生改變&#xff0c;但今天我們要創造一個 “調皮” 的按鈕&#xff0c;當用戶鼠標懸停在上面時&#xff0c;它會自動閃避&#xff0c;仿佛在和用戶玩游戲。本文將詳…

**Java面試:技術大比拼**

互聯網大廠Java面試&#xff1a;一場嚴肅與搞笑交織的技術拷問 場景&#xff1a;互聯網大廠面試間 面試官&#xff08;嚴肅&#xff09;&#xff1a;請坐。馬小帥&#xff0c;我們今天主要考察一下你在Java技術棧上的掌握程度&#xff0c;以及如何將這些技術應用于實際業務場景…

25考頻高的前端面試題

請求失敗會彈出一個toast&#xff0c;如何保證批量請求失敗&#xff0c;只彈出一個toast 設置全局標志位&#xff0c;定義一個全局變量&#xff08;如isToastShown)來表示是否已經彈出過toast。在請求失敗的處理邏輯中&#xff0c;首先檢查該標志位。如果尚未彈出toast&#xf…

命令模式(Command Pattern)詳解

文章目錄 1. 什么是命令模式?2. 為什么需要命令模式?3. 命令模式的核心概念4. 命令模式的結構5. 命令模式的基本實現5.1 簡單的燈光控制示例5.2 家電控制示例6. 帶有撤銷功能的命令模式6.1 修改命令接口6.2 實現可撤銷的燈光命令6.3 實現可撤銷的風扇命令6.4 修改調用者,支持…

《Vue3學習手記8》

vue3中的一些API shallowRef ( ) 和shallowReactive ( ) shallowRef (淺層響應式) 1.作用:創建一個響應式數據&#xff0c;但只對頂層屬性進行響應式處理。 2.用法: const originalref(...) const original2shallowRef(original) 3.特點:只跟蹤引用值的變化&#xff0c;不關心…

雙列集合——map集合和三種遍歷方式

雙列集合的特點 鍵和值一一對應&#xff0c;每個鍵只能對應自己的值 一個鍵和值整體稱為鍵值對或鍵值對對象&#xff0c;java中叫做entry對象。 map常見的api map接口中定義了雙列集合所有的共性方法&#xff0c;下面三個實現類就沒有什么額外新的方法要學習了。 map接口…

Linux安裝部署Postgresql數據庫

聯網安裝方案 Linux能在線安裝依賴組件的前提下&#xff0c;可以快速安裝部署PG數據庫&#xff0c;安裝過程使用root管理員帳號&#xff1a; 首先&#xff0c;使用如下命令自動下載Postgresql組件&#xff1a; # 在openEuler、Fedora或CentOS 8上&#xff0c;你可能會使用&a…

供應鏈算法整理(二)--- 智能補貨

供應鏈業務的目標價值是&#xff1a;優化貨品的供給、銷售提供支撐&#xff0c;以降低成本&#xff0c;提高時效、收益&#xff0c;最終提升用戶體驗。基于目標價值&#xff0c;整體的算法模塊分為&#xff1a;智能選品、智能預測、品倉鋪貨、智能補貨、智能調撥、倉網路由、快…

vscode 個性化

vscode 個性化 設置 吸頂效果 使用前使用后 設置方法 VS Code 的粘性滾動預覽 - 類似于 Excel 的凍結首行 插件 代碼片段分享 - CodeSnap 使用方式 CtrlShiftP輸入CodeSnap 喚起插件選擇代碼 行內報錯提示 - Error Lens 使用前使用后 VSCode Error Lens插件介紹&…

Rockermq的部署與使用(0-1)

?RocketMQ? 是阿里巴巴開源的一款 ?分布式消息中間件&#xff0c;具有高吞吐、低延遲、高可用等特點&#xff0c;廣泛應用于多個領域&#xff0c;包括異步通信解耦、企業解決方案、金融支付、電信、電子商務、快遞物流、廣告營銷、社交、即時通信、移動應用、手游、視頻、物…

軟件測試報告機構如何保障軟件質量并維護其安全性?

軟件測試報告機構在軟件開發流程里起著十分關鍵的作用&#xff0c;它可以保障軟件的質量&#xff0c;它還能夠維護軟件的安全性。下面&#xff0c;我們就來深入了解一下這類機構。 機構作用 軟件測試報告機構是軟件質量的“把關者”&#xff0c;能對軟件進行全面評估&#xf…

4個純CSS自定義的簡單而優雅的滾動條樣式

今天發現 uni-app 項目的滾動條不顯示&#xff0c;查了下原來是設置了 ::-webkit-scrollbar {display: none; } 那么怎么用 css 設置滾動條樣式呢&#xff1f; 定義滾動條整體樣式? ::-webkit-scrollbar 定義滾動條滑塊樣式 ::-webkit-scrollbar-thumb 定義滾動條軌道樣式?…