設計模式25——中介者模式

寫文章的初心主要是用來幫助自己快速的回憶這個模式該怎么用,主要是下面的UML圖可以起到大作用,在你學習過一遍以后可能會遺忘,忘記了不要緊,只要看一眼UML圖就能想起來了。同時也請大家多多指教。

中介者模式(Mediator)

對象行為型模式。

目錄

一、概述

1.1、直觀的理解:

1.2、主要角色:

1.3、描述對象之間關系的UML圖:

1.4、適用場景:

二、代碼舉例

2.1、對象之間的關系用UML圖描述如下:

2.2、Java代碼如下:


一、概述

1、用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。

1.1、直觀的理解

假設現有4個同事類對象,要讓他們之間可以兩兩交互,對比普通方式和中介者模式的區別:

可以看到,在沒有使用中介者模式時每個同事類都要產生3個給對方發送消息和3個接收消息的動作,如果是有很多的同事,那么在想要修改時會非常復雜。而使用中介者后,每個同事類只需要1個給中介發消息和1個接收中介者消息的動作,同事類之間的交互都由中介者轉發,且都是和中介者進行交互,大大的減少了同事類之間的耦合。

1.2、主要角色:

  • 中介者:中介者的抽象類和接口 + 具體的中介者類,協調同事類們之間的通訊
  • 同事類:同事類的抽象類和接口 + 具體的同事類,需要通訊的對象

1.3、描述對象之間關系的UML圖:

(我們會發現,這相當于把同事類之間的交互控制全部放到了中介者類里,此時中介類會變得比任何一個同事類都復雜)

1.4、適用場景:

  • 一組對象以定義良好但復雜的方式進行通訊,產生的相互依賴關系結構混亂且難以理解
  • 一個對象引用其他很多對象并且直接與這些對象通信,導致難以復用該對象
  • 想定制一個分布在多個類中的行為,而又不想生成太多的子類

(注:當系統中出現多對多交互復雜的對象時,不要急著使用中介者模式,而要先反思你的系統在設計上是不是合理的)

二、代碼舉例

假設有兩個同事類1和2要進行交互。這個例子比較簡單,就不再詳細分析了。但你可以把本例當做一個模板,然后靈活使用:

2.1、對象之間的關系用UML圖描述如下:

2.2、Java代碼如下:

同事類的抽象類:

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

同事類1:

public class ConcreteColleague1 extends Colleague {public ConcreteColleague1(Mediator mediator) {super(mediator);}public void send(String message) {this.mediator.send(message, this);}public void notify(String message) {System.out.println("同事1收到信息:" + message);}
}

同事類2:

public class ConcreteColleague2 extends Colleague {public ConcreteColleague2(Mediator mediator) {super(mediator);}public void send(String message) {this.mediator.send(message, this);}public void notify(String message) {System.out.println("同事2收到信息:" + message);}
}

中介者的抽象類:

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

具體的中介者的類:

public class ConcreteMediator extends Mediator {private ConcreteColleague1 colleague1;private ConcreteColleague2 colleague2;public void setColleague1(ConcreteColleague1 colleague1) {this.colleague1 = colleague1;}public void setColleague2(ConcreteColleague2 colleague2) {this.colleague2 = colleague2;}@Overridepublic void send(String message, Colleague colleague) {if (colleague == this.colleague1){this.colleague2.notify(message);} else{this.colleague1.notify(message);}}
}

主程序(發起請求的類):

public class Main {public static void main(String[] args) {ConcreteMediator mediator = new ConcreteMediator();ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);mediator.setColleague1(colleague1);mediator.setColleague2(colleague2);colleague1.send("你好嗎?");colleague2.send("我很好。");}
}

這里就不再舉例了,可以把上面的Java例子復制到你本地,運行main函數試一下加深理解。這些代碼都是我自己學習的時候根據一些教材手敲的,不存在bug可以直接運行。

如果覺得本文還不錯,就請點個贊給作者一點鼓勵吧!如果有建議,也請評論指教和討論!

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

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

相關文章

Java基礎 Day25

一、線程通信 1、簡介 確保線程能夠按照預定的順序執行并且能夠安全地訪問共享資源 使多條線程更好的進行協同工作 2、常用方法 void wait() 使當前線程進入等待狀態 void notify(); 隨機喚醒單個等待的線程(可以空喚醒) void notifyAll(); 喚醒…

WebSocket與實時對話式AI服務的集成

WebSocket與實時對話式AI服務的集成 在現代對話式AI系統中,傳統的HTTP請求-響應模型已難以滿足實時交互的體驗需求。特別是用戶對響應速度、逐字輸出、會話上下文保持等方面提出更高要求時,需要一種能夠建立持久連接并支持雙向通信的協議。WebSocket正是在這一背景下,成為A…

iOS 集成網易云信IM

云信官方文檔在這 看官方文檔的時候&#xff0c;版本選擇最新的V10。 1、CocoPods集成 pod NIMSDK_LITE 2、AppDelegate.m添加頭文件 #import <NIMSDK/NIMSDK.h> 3、初始化 NIMSDKOption *mrnn_option [NIMSDKOption optionWithAppKey:"6f6568e354026d2d658a…

人工智能100問?第37問:什么是擴散模型?

目錄 ??一、通俗解釋 二、專業解析?? 三、權威參考 擴散模型是一種??通過系統性地添加再去除噪聲來生成新數據(如圖像)的生成式AI技術??,其核心機制分為兩個階段:正向擴散??:對原始數據(如清晰圖片)逐步添加噪聲,直至完全變成隨機噪點(類似老照片逐漸模糊…

傳輸層核心技術解析

目錄 一、端口號機制 二、網絡診斷工具 1. netstat命令 2. pidof工具 三、UDP協議詳解 協議特征 典型應用場景 四、TCP協議深度解析 核心機制 狀態轉換模型 特殊狀態說明 五、協議對比分析 六、開發實踐要點 一、端口號機制 核心作用&#xff1a;標識主機唯一進程…

IO Vs NIO

一、IO(傳統阻塞式) 全稱?&#xff1a;Input/Output(輸入/輸出) 定義?&#xff1a;Java 1.0 引入的基礎 I/O 模型&#xff0c;基于流&#xff08;Stream&#xff09;的同步阻塞操作&#xff0c;線程在讀寫數據時會阻塞直到操作完成。 二、NIO(新式非阻塞式) ?全…

基于原生JavaScript前端和 Flask 后端的Todo 應用

Demo地址&#xff1a;https://gitcode.com/rmbnetlife/todo-app-js-flask.git Python Todo 應用 這是一個使用Python Flask框架開發的簡單待辦事項(Todo)應用&#xff0c;采用前后端分離架構。本項目實現了待辦事項的添加、刪除、狀態切換等基本功能&#xff0c;并提供了直觀…

005 ElasticSearch 許可證過期問題

ElasticSearch 許可證過期問題 項目啟動報錯 org.elasticsearch.client.ResponseException: method [GET], host [http://127.0.0.1:9200], URI [/_cluster/health/], status line [HTTP/1.1 403 Forbidden] {"error":{"root_cause":[{"type":…

哪些崗位最易被AI替代?

隨著AI技術高速演進&#xff0c;一場“職場大洗牌”正悄然上演。當ChatGPT出口成章、機器人能精準執勤&#xff0c;AI時代的“就業焦慮”已不再是空談。你是否認真思考過&#xff0c;自己所處的崗位是否也正面臨被AI邊緣化的風險&#xff1f; 以下幾類職業&#xff0c;已成為AI…

信號槽中 sender() 的作用

好的,sender() 是 Qt 框架中的一個重要函數,它用于獲取觸發當前槽函數的對象。在 Qt 的信號和槽機制中,一個信號可以連接到多個槽函數,而一個槽函數也可以被多個信號觸發。sender() 函數允許你在槽函數中確定是哪個對象觸發了當前信號。 信號和槽機制 在 Qt 中,信號和槽…

深度學習|pytorch基本運算

【1】引言 pytorch是深度學習常用的包&#xff0c;顧名思義&#xff0c;就是python適用的torch包&#xff0c;在python里面使用時直接import torch就可以調用。 需要注意的是&#xff0c;pytorch包與電腦配置、python版本有很大關系&#xff0c;一定要仔細閱讀安裝要求、找到…

DeepSeek 賦能數字人直播帶貨:技術革新重塑電商營銷新生態

目錄 一、引言二、DeepSeek 技術探秘2.1 DeepSeek 技術原理剖析2.2 DeepSeek 與其他大模型對比優勢 三、數字人直播帶貨現狀洞察3.1 數字人直播帶貨發展歷程回顧3.2 市場規模與增長趨勢分析3.3 現存問題與挑戰探討 四、DeepSeek 在數字人直播帶貨中的應用實例4.1 交個朋友的成功…

實驗設計與分析(第6版,Montgomery)第5章析因設計引導5.7節思考題5.11 R語言解題

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅玨生譯) 第5章析因設計引導5.7節思考題5.11 R語言解題。主要涉及方差分析&#xff0c;正態假設檢驗&#xff0c;殘差分析&#xff0c;交互作用圖。 dataframe<-data.frame( densityc(570,565,…

四、關系數據庫標準語言SQL_1

四、關系數據庫標準語言SQL_1 主要內容 4.1 SQL概述 SQL簡介 4.2 SOL的系統結構4.3 SQL數據定義 SQL的數據定義 4.5 SQL數據查詢4.6 SQL數據更新4.7 SQL中的視圖4.8 SQL的數據控制4.9 嵌入式SQL小結 4.1 SQL概述 主要內容 SQL簡介SQL的特點SQL的系統結構 SQL簡介 SQL&…

vscode的Embedded IDE創建keil項目找不到源函數或者無法跳轉

創建完Embedded IDE項目后跳轉索引很容易找不到源函數或者無法跳轉&#xff0c;原因是vscode工作區被eide覆蓋了&#xff0c;需要手動往當前目錄下的.vscode/c_cpp_properties.json里添加路徑 打開eide.json &#xff0c;找到folders&#xff0c; 里面的name是keil里工程的虛擬…

【Docker管理工具】部署Docker管理面板DweebUI

【Docker管理工具】部署Docker管理面板DweebUI 一、DweebUI介紹1.1 DweebUI 簡介1.2 主要特點1.3 使用場景 二、本次實踐規劃2.1 本地環境規劃2.2 本次實踐介紹 三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3 檢查docker compose 版本 四、下載DweebUI鏡像五、…

CentOS7.9環境離線部署docker和docker-compose的兩種方式

目 錄 一、yum安裝&#xff0c;使用rpm安裝包和相關依賴 1.1 準備rpm安裝包 1.2 將docker-23.0.4.tar.gz上傳至/opt目錄下 二、二進制文件方式安裝 三、安裝docker-compose 一、yum安裝&#xff0c;使用rpm安裝包和相關依賴 1.1 準備rpm安裝包 1&#xff09;在一臺與…

AI賦能SEO關鍵詞策略

內容概要 當前搜索引擎優化領域正經歷由人工智能驅動的范式革新。傳統關鍵詞研究依賴人工統計與經驗判斷&#xff0c;而AI技術通過多維數據建模與自然語言處理&#xff0c;實現了從用戶行為分析到語義關聯挖掘的系統升級。具體而言&#xff0c;智能語義解析技術可穿透表層搜索…

MonoPCC:用于內窺鏡圖像單目深度估計的光度不變循環約束|文獻速遞-深度學習醫療AI最新文獻

Title 題目 MonoPCC: Photometric-invariant cycle constraint for monocular depth estimation of endoscopic images MonoPCC&#xff1a;用于內窺鏡圖像單目深度估計的光度不變循環約束 01 文獻速遞介紹 單目內窺鏡是胃腸診斷和手術的關鍵醫學成像工具&#xff0c;但其…

使用基于Xsens慣性傳感器的動作捕捉技術測量人體工程學

由于單調和片面的體力消耗&#xff0c;牙科領域的從業者患肌肉骨骼疾病 (MSD) 的幾率很高。慣性測量單元 (IMU) 越來越成為評估工作姿勢風險的焦點。因此&#xff0c;本研究旨在使用基于慣性傳感器的運動捕捉 (MoCap) 評估人體工程學講座和培訓干預對牙科助理學生的姿勢風險和M…