深入理解設計模式之中介者模式

深入理解設計模式之:中介者模式(Mediator Pattern)

一、什么是中介者模式?

中介者模式(Mediator Pattern)是一種行為型設計模式。它通過引入一個中介對象,來封裝一組對象之間的交互,使對象之間不再直接引用彼此,而是通過中介者進行通信,從而降低對象之間的耦合度,便于系統的擴展和維護。

核心思想:
將對象之間復雜的網狀關系變為星型結構,所有對象只與中介者交互。


二、應用場景

  • GUI 界面組件之間的交互(如按鈕、文本框、下拉框等)
  • 聊天室、消息總線、事件總線
  • 機場調度、交通信號燈等需要統一協調的場景
  • Spring ApplicationContext、事件發布機制

三、模式結構

  • Mediator(抽象中介者):定義同事對象之間通信的接口
  • ConcreteMediator(具體中介者):實現協調各同事對象的通信
  • Colleague(同事類):各參與交互的對象,持有中介者引用

四、UML 類圖

+-------------------+
|    Mediator       |<-------------------+
+-------------------+                    |
| +notify()         |                    |
+-------------------+                    |/_\                              ||                               |
+---------------------+         +---------------------+
| ConcreteMediator    |         |   Colleague         |
+---------------------+         +---------------------+
| +notify()           |         | mediator: Mediator  |
| +register()         |         | +send()             |
+---------------------+         | +receive()          |+---------------------+/_\|+----------------+----------------+|                                 |+-------------------+             +-------------------+| ColleagueA        |             | ColleagueB        |+-------------------+             +-------------------+

五、Java 實現代碼示例

1. 抽象中介者

public interface Mediator {void send(String message, Colleague colleague);
}

2. 抽象同事類

public abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}
}

3. 具體同事類

public class ColleagueA extends Colleague {public ColleagueA(Mediator mediator) {super(mediator);}public void send(String message) {System.out.println("ColleagueA 發送消息: " + message);mediator.send(message, this);}public void receive(String message) {System.out.println("ColleagueA 收到消息: " + message);}
}public class ColleagueB extends Colleague {public ColleagueB(Mediator mediator) {super(mediator);}public void send(String message) {System.out.println("ColleagueB 發送消息: " + message);mediator.send(message, this);}public void receive(String message) {System.out.println("ColleagueB 收到消息: " + message);}
}

4. 具體中介者

public class ConcreteMediator implements Mediator {private ColleagueA colleagueA;private ColleagueB colleagueB;public void setColleagueA(ColleagueA colleagueA) {this.colleagueA = colleagueA;}public void setColleagueB(ColleagueB colleagueB) {this.colleagueB = colleagueB;}@Overridepublic void send(String message, Colleague colleague) {if (colleague == colleagueA) {colleagueB.receive(message);} else if (colleague == colleagueB) {colleagueA.receive(message);}}
}

5. 客戶端調用

public class Main {public static void main(String[] args) {ConcreteMediator mediator = new ConcreteMediator();ColleagueA a = new ColleagueA(mediator);ColleagueB b = new ColleagueB(mediator);mediator.setColleagueA(a);mediator.setColleagueB(b);a.send("你好,B!");b.send("你好,A!");}
}

輸出:

ColleagueA 發送消息: 你好,B!
ColleagueB 收到消息: 你好,B!
ColleagueB 發送消息: 你好,A!
ColleagueA 收到消息: 你好,A!

六、優缺點

優點:

  • 降低對象之間的耦合度,便于擴展和維護
  • 集中管理對象間的交互,邏輯清晰
  • 易于增加新同事類和中介者

缺點:

  • 中介者可能變得過于復雜,成為“上帝類”
  • 過多的中介邏輯可能影響性能和可維護性

七、實際應用舉例

  • 聊天室中的消息轉發
  • GUI 組件事件協調
  • Spring 事件發布機制
  • 業務流程編排引擎

八、總結

中介者模式是解耦對象間復雜交互的有效手段,適合多對象協作、交互復雜的場景。掌握中介者模式有助于編寫高內聚、低耦合的系統架構。

建議:

  • 適用于對象間交互復雜、變化頻繁的系統
  • 注意中介者的復雜度,避免成為“上帝類”

如需更多設計模式講解或源碼分析,歡迎留言交流!

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

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

相關文章

基于通義千問的兒童陪伴學習和成長的智能應用架構。

1.整體架構概覽 我們的兒童聊天助手將采用典型的語音交互系統架構,結合大模型能力和外部知識庫: 2. 技術方案分解 2.1. 前端應用/設備 選擇: 移動App(iOS/Android)、Web應用,或者集成到智能音箱/平板等硬件設備中。技術棧: 移動App: React Native / Flutter (跨平臺…

Python Day40

Task&#xff1a; 1.彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封裝在函數中 2.展平操作&#xff1a;除第一個維度batchsize外全部展平 3.dropout操作&#xff1a;訓練階段隨機丟棄神經元&#xff0c;測試階段eval模式關閉dropout 作業&#xff1a;仔細學習下測試和訓練代…

WordPress_suretriggers 權限繞過漏洞復現(CVE-2025-3102)

免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 前…

基于Spring Boot 電商書城平臺系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

LeetCode 39.組合總和:回溯法與剪枝優化的完美結合

一、問題本質與形式化定義 1.1 題目形式化描述 輸入&#xff1a;無重復整數數組candidates、目標值target輸出&#xff1a;所有和為target的組合集合&#xff0c;滿足&#xff1a; 元素可重復使用組合內元素非降序&#xff08;避免重復解&#xff09;解集無重復組合 1.2 問…

windows11安裝編譯QtMvvm

windows11安裝編譯QtMvvm 1 從github下載代碼2 官方的Download/Installtion3 自行構建編譯QtMvvm遇到的問題3.1 `qmake`問題執行命令報錯原因分析qmake報錯:找不到編譯器 cl解決方案3.2 `make qmake_all`問題執行命令報錯原因分析make命令未識別解決方案3.3 缺少`perl`問題執行…

unix/linux source 命令,其歷史爭議、兼容性、生態、未來展望

現在把目光投向unix/linux source命令的歷史爭議、兼容性、生態和未來展望,這能讓我們更全面地理解一個技術點在更廣闊的圖景中所處的位置。 一、歷史爭議與設計權衡 雖然 source (或 .) 命令功能強大且不可或缺,但在其發展和使用過程中,也存在一些微妙的爭議或設計上的權衡…

開發時如何通過Service暴露應用?ClusterIP、NodePort和LoadBalancer類型的使用場景分別是什么?

一、Service核心概念 Service通過標簽選擇器&#xff08;Label Selector&#xff09;關聯Pod&#xff0c;為動態變化的Pod集合提供穩定的虛擬IP和DNS名稱&#xff0c;主要解決&#xff1a; 服務發現負載均衡流量路由 二、Service類型詳解 1. ClusterIP&#xff08;默認類型…

從線性代數到線性回歸——機器學習視角

真正不懂數學就能理解機器學習其實是個神話。我認為&#xff0c;AI 在商業世界可以不懂數學甚至不懂編程也能應用&#xff0c;但對于技術人員來說&#xff0c;一些基礎數學是必須的。本文收集了我認為理解學習本質所必需的數學基礎&#xff0c;至少在概念層面要掌握。畢竟&…

華為IP(7)

端口隔離技術 產生的背景 1.以太交換網絡中為了實現報文之間的二層隔離&#xff0c;用戶通常將不同的端口加入不同的VLAN&#xff0c;實現二層廣播域的隔離。 2.大型網絡中&#xff0c;業務需求種類繁多&#xff0c;只通過VLAN實現二層隔離&#xff0c;會浪費有限的VLAN資源…

Docker Desktop無法在windows低版本進行安裝

問題描述 因工作需要&#xff0c;現在一臺低版本的window系統進行Docker Desktop的安裝&#xff0c;但是安裝過程當中出現了報錯信息 系統版本配置 原因分析&#xff1a; 關于本機查看了系統的版本號&#xff0c;版本號如下為1909,但是docker Desktop要求的最低的win10版本…

深入理解 Maven 循環依賴問題及其解決方案

在 Java 開發領域&#xff0c;Maven 作為主流構建工具極大簡化了依賴管理和項目構建。然而**循環依賴&#xff08;circular dependency&#xff09;**問題仍是常見挑戰&#xff0c;輕則導致構建失敗&#xff0c;重則引發類加載異常和系統架構混亂。 本文將從根源分析循環依賴的…

Git 全平臺安裝指南:從 Linux 到 Windows 的詳細教程

目錄 一、Git 簡介 二、Linux 系統安裝指南 1、CentOS/RHEL 系統安裝 2、Ubuntu/Debian 系統安裝 3、Windows 系統安裝 四、安裝后配置&#xff08;后面會詳細講解&#xff0c;現在了解即可&#xff09; 五、視頻教程參考 一、Git 簡介 Git 是一個開源的分布式版本控制系…

微服務-Sentinel

目錄 背景 Sentinel使用 Sentinel控制臺 Sentinel控制規則 Sentinel整合OpenFeign 背景 在微服務項目架構中&#xff0c;存在多個服務相互調用場景&#xff0c;在某些情況下某個微服務不可用時&#xff0c;上游調用者若一直等待&#xff0c;會產生資源的消耗&#xff0c;極端情…

智慧零工平臺前端開發實戰:從uni-app到跨平臺應用

智慧零工平臺前端開發實戰:從uni-app到跨平臺應用 本文將詳細介紹我如何使用uni-app框架開發一個支持微信小程序和H5的零工平臺前端應用,包含技術選型、架構設計、核心功能實現及部署經驗。 前言 在當今移動互聯網時代,跨平臺開發已成為提高開發效率的重要手段。本次我選擇…

Qt實現csv文件按行讀取的方式

Qt實現csv文件按行讀取的方式 場景:我有一個保存數據的csv文件,文件內保存的是按照行保存的數據,每行數據是以逗號為分隔符分割的文本數據。如下圖所示: 現在,我需要按行把這些數據讀取出來。 一、使用QTextStream文本流的方式讀取 #include <QFile>void readfil…

day17 leetcode-hot100-34(鏈表13)

23. 合并 K 個升序鏈表 - 力扣&#xff08;LeetCode&#xff09; 1.數組排序 思路 &#xff08;1&#xff09;將全部的節點存儲到數組中 &#xff08;2&#xff09;對數組進行排序 &#xff08;3&#xff09;最后創建一個全新的鏈表 具體代碼 /*** Definition for singly…

docker運行程序Killed異常排查

問題描述 我最近開發了一個C 多線程程序&#xff0c;測試沒有問題&#xff0c;封裝docker測試也沒有問題&#xff0c;然后提交給客戶了&#xff0c;然后在他那邊測試有問題&#xff0c;不定時、不定位置異常中斷&#xff0c;以前一直認為只要封裝了docker就萬事大吉&#xff0…

爬蟲的幾種方式(使用什么技術來進行一個爬取數據)

在網頁數據爬取中&#xff0c;確實存在多種數據呈現和獲取形式&#xff0c;遠不止靜態HTML解析和簡單JS渲染。理解這些形式對于應對不同的反爬機制至關重要&#xff1a; 主要數據獲取形式與應對策略 純靜態HTML (基礎形式) 特點&#xff1a; 數據直接嵌入在服務器返回的初始HT…

MyBatis-Plus高級用法:最優化持久層開發

MyBatis-Plus 是 MyBatis 的增強工具&#xff0c;旨在簡化開發、提高效率并保持 MyBatis 的靈活性。本文將詳細介紹 MyBatis-Plus 的高級用法&#xff0c;幫助開發者最優化持久層開發。 一、MyBatis-Plus 簡介 MyBatis-Plus 是一個 ORM 框架&#xff0c;提供了 CRUD 接口、條…