《設計模式之禪》筆記摘錄 - 7.中介者模式

中介者模式的定義

中介者模式的定義為:

Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently. (用一個中介對象封裝一系列的對象交互,中介者使各對象不需要顯示地相互作用,從使其合松散,而且可以獨立地改變它們之間的交互。)

從類圖中看,中介者模式由以下幾部分組成:

Mediator。抽象中介者角色定義統一的接口,用于各同事角色之間的通信。

Concrete Mediator。具體中介者角色,通過協調各同事角色實現協作行為,因此它必須依賴于各個同事角色。

Colleague。同事角色,每一個同事角色都知道中介者角色,而且與其他的同事角色通信的時候,一定要通過中介角色協作。

每個同事類的行為分為兩種:一種是同事本身的行為,比如改變對象本身的狀態,理自己的行為等,這種行為叫做自發行為(Self-Method),與其他的同事類或中介者沒有任可的依賴;第二種是必須依賴中介者才能完成的行為,叫做依賴方法(Dep-Method)。

中介者模式的應用

中介者模式的優點

中介者模式的優點就是減少類間的依賴,把原有的一對多的依賴變成了一對一的依賴,同事類只依賴中介者,減少了依賴,當然同時也降低了類間的耦合。

中介者模式的缺點

中介者模式的缺點就是中介者會膨脹得很大,而且邏輯復雜,原本N個對象直接的相互依賴關系轉換為中介者和同事類的依賴關系,同事類越多,中介者的邏輯就越復雜。

中介者模式的使用場景

中介者模式簡單,但是簡單不代表容易使用,很容易被誤用。在面向對象的編程中,對象和對象之間必然會有依賴關系,如果某個類和其他類沒有任何相互依賴的關系,那這個類就是一個“孤島”,在項目中就沒有存在的必要了!

類之間的依賴關系是必然存在的,一個類依賴多個類的情況也是存在的,存在即合理,那是否可以說只要有多個依賴關系就考慮使用中介者模式呢?答案是否定的。

中介者模式未必能幫你把原本凌亂的邏輯整理得清清楚楚,而且中介者模式也是有缺點的,這個缺點在使用不當時會被放大,比如原本就簡單的幾個對象依賴關系,如果為了使用模式而加入了中介者,必然導致中介者的邏輯復雜化,因此中介者模式的使用需要“量力而行”!

中介者模式適用于多個對象之間緊密耦合的情況,緊密耦合的標準是:在類圖中出現了蜘蛛網狀結構。在這種情況下一定要考慮使用中介者模式,這有利于把蜘蛛網梳理為星型結構,使原本復雜混亂的關系變得清晰簡單。

中介者模式的實際應用

中介者模式也叫做調停者模式,是什么意思呢?一個對象要和N多個對象交流,就像對象間的戰爭,很混亂。這時,需要加入一個中心,所有的類都和中心交流,中心說怎么處理就怎么處理。

最佳實踐

本章講述的中介者模式很少用到接口或者抽象類,這與依賴倒置原則是沖突的,這是什么原因呢?

首先,既然是同事類而不是兄弟類(有相同的血緣),那就說明這些類之間是協作關系,完成不同的任務,處理不同的業務,所以不能在抽象類或接口中嚴格定義同事類必須具有的方法(從這點也可以看出繼承是高侵入性的)。這是不合適的,就像你我是同事,雖然我們家都是朝九晚五地上班,但是你跟我干的活肯定不同,不可能抽象出一個父類統一定義同事所必須有的方法。

中介者模式是一個非常好的封裝模式,也是一個很容易被濫用的模式,一個對象依賴幾個對象是再正常不過的事情,但是純理論家就會要求使用中介者模式來封裝這種依賴關系,這是非常危險的!

使用中介模式就必然會帶來中介者的膨脹問題,這在一個項目中是很不恰當的。

可以在如下的情況下嘗試使用中介者模式:

N個對象之間產生了相互的依賴關系(N> 2)。

多個對象有依賴關系,但是依賴的行為尚不確定或者有發生改變的可能,在這種情況下一般建議采用中介者模式,降低變更引起的風險擴散。

產品開發。一個明顯的例子就是MVC框架,把中介者模式應用到產品中,可以提升產品的性能和擴展性,但是對于項目開發就未必,因為項目是以交付投產為目標,而產品則是以穩定、高效、擴展為宗旨。

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

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

相關文章

Flutter:上傳圖片,選擇相機或相冊:wechat_assets_picker

圖片選擇功能:可選單張,或多張。 1、showModalBottomSheet(選擇相冊/相機) 2、WechatImagePicker(選取圖片) 3、CompressMediaFile(圖片壓縮)1、ActionSheetUtilimport package:duca…

pytest--0

1 pytest 使用方式 pytest測試框架-- 基本功能使用詳解 2 pytest-mock常用方式 pytest–1–pytest-mock常用的方法 3

multiprocessing.Pool 中的 pickle 詳解

前言: 在 Python 的 multiprocessing.Pool 中,任務和數據需要通過序列化(pickle)傳遞給子進程。pickle 是 Python 的內置序列化模塊,用于將 Python 對象轉換為字節流,以便在進程間通信時傳遞。然而&#xf…

Java集合框架體系詳解:List/Set/Map接口對比與核心實現原理

一、集合框架核心接口對比 1.1 List/Set/Map接口特性接口類型特性描述典型實現List有序可重復,支持索引訪問ArrayList/LinkedListSet無序不可重復,基于哈希表或樹實現HashSet/TreeSetMap鍵值對存儲,鍵唯一值可重復HashMap/TreeMap核心差異&am…

LeafletJS 進階:GeoJSON 與動態數據可視化

引言 LeafletJS 作為一個輕量、靈活的 JavaScript 地圖庫,以其對 GeoJSON 數據格式的強大支持而聞名。GeoJSON 是一種基于 JSON 的地理數據格式,能夠表示點(Point)、線(LineString)、多邊形(Po…

【STM32實踐篇】:F407 時鐘系統

文章目錄1. 時鐘與啟動2. CubeMX 時鐘樹2.1 時鐘源2.2 PLL 鎖相環2.3 時鐘分發與選擇2.4 頻率限制1. 時鐘與啟動 復位默認時鐘:系統復位后,CPU 時鐘默認由 16MHz 內部 RC 振蕩器(HSI)提供,該 RC 振蕩器經工廠校準&…

純前端html實現圖片坐標與尺寸(XY坐標及寬高)獲取

純前端html實現圖片坐標與尺寸&#xff08;XY坐標及寬高&#xff09;獲取。用于證書圖片或pdf打印的坐標測定。 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>純html前端實現圖片坐標與尺寸&am…

飛睿UWB超寬帶定位測距技術,數字鑰匙重塑智能生活,高精度厘米級定位無感解鎖

最近&#xff0c;數字鑰匙領域動作頻頻&#xff0c;科技巨頭與車企正掀起一波創新浪潮。小米15S Pro搭載恩智浦UWB芯片&#xff0c;用戶靠近閘機即可無感通行深圳云巴一號線&#xff0c;輕觸小米YU7車門自動解鎖&#xff0c;實現手機-汽車-公共交通的無縫數字鑰匙生態。在智能家…

基于springboot+vue+mysql平臺的醫療病歷交互系統(源碼+論文)

一、開發環境 相關技術介紹 B/S模式分析 C/S模式&#xff1a;主要由客戶應用程序(Client)、服務器管理程序(Server)和中間件(middleware)三個部件組成。客戶應用程序是系統中用戶與數據組件交互。服務器程序負責系統資源&#xff0c;如管理信息數據庫的有效管理。中間件負責連…

arm架構,arm內核,處理器之間的關系

一、情景分析 我們經常說&#xff0c;stm32f103是采用cotex-M3內核&#xff0c;基于armv7架構設計的。 那么&#xff0c;stm32f103、cotex-M3、armv7之間有什么關系呢&#xff1f; 二、層次分析 1. 架構&#xff08;Architecture&#xff09; 定義&#xff1a;架構是處理器…

基于PHP的招投標系統_603gk

目錄具體實現截圖課程項目技術路線開發技術介紹PHP核心代碼部分展示系統測試詳細視頻演示/源碼獲取具體實現截圖 課程項目技術路線 招投標系統后端采用 PHP 語言搭配Thinkphp或者 Laravel 框架&#xff0c;PHP 語法簡潔且功能強大&#xff0c;Laravel 或者Thinkphp框架能優化代…

深入解析 JavaScript 中的 `$.ajax()`:專業指南與實戰示例

文章目錄一、為什么需要 $.ajax()&#xff1f;二、核心語法解析三、關鍵參數深度剖析四、實戰示例&#xff1a;從基礎到進階五、錯誤處理最佳實踐六、性能與安全優化七、現代替代方案對比八、總結作為網站編輯&#xff0c;我將帶您深入剖析 jQuery 的 $.ajax() 方法。本文不僅涵…

Flutter 前端開發中的常見問題全面解析

Flutter 開發中的常見問題全面解析一篇給 Flutter 開發者「靈兒」里里外外都能看的問題項。從基礎開發到打包上線&#xff0c;每一步都充滿坑&#xff0c;我們詳細列出「環環盜光」的那些場景和解決思路&#xff01;【基礎系統】開發環境問題 1. flutter doctor 報錯 常見錯誤:…

STM32 單片機的停車場管理系統設計與實現

基于 STM32 的停車場管理系統設計與實現摘要隨著城市汽車保有量的快速增長&#xff0c;停車場管理的效率與智能化水平愈發重要。本文設計并實現了一套基于 STM32 單片機的停車場管理系統&#xff0c;整合車輛檢測、車位引導、計費管理及信息交互等功能。系統以 STM32 為控制核心…

STM32 寫選項字 關鍵要加載HAL_FLASH_OB_Launch

AI亂寫&#xff0c;還是得自己來&#xff01;void Write_OptionBytes_IWDG_STDBY(void) {FLASH_OBProgramInitTypeDef OBInit;HAL_FLASHEx_OBGetConfig(&OBInit); // 獲取當前選項字節配置[6,7](ref)// 檢查當前nRST_STDBY位&#xff08;IWDG_STDBY相關位&#xff09;是否…

153.在 Vue 3 中使用 OpenLayers + Cesium 實現 2D/3D 地圖切換效果

&#x1f3ac; 效果演示截圖 ? 前言 在實際項目開發中&#xff0c;我們經常需要提供「二維地圖 三維地形」的可視化效果切換&#xff0c;例如&#xff1a; 智慧農業展示耕地分布 三維地形起伏&#xff1b; 智慧城市展示建筑物點位 三維城市&#xff1b; 數字孿生場景中&…

純C++11實現!零依賴貝葉斯情感分析系統,掌握機器學習系統工程化的秘密!

本文深度剖析了一個完全基于C++11標準庫實現的貝葉斯情感分析系統。該系統采用模塊化設計,實現了從文本預處理、特征提取到樸素貝葉斯分類的完整機器學習流水線。 1. 系統架構概覽 1.1 技術棧選擇與設計哲學 該系統完全采用C++11標準庫實現,無任何外部依賴,體現了"純…

Android原生Dialog

在原生android里面&#xff0c;有兩種dialog寫法&#xff0c;一種是直接使用里面提供的AlertDialog.Builder方法去使用&#xff0c;另一種是我們自己根據自己的ui來設計&#xff08;自定義&#xff09;。在一般開發中&#xff0c;我們主要使用的是自定義&#xff0c;主要是Aler…

Nacos 開源 MCP Router,加速 MCP 私有化部署

作者&#xff1a;正己 Nacos MCP Router 簡介 Nacos MCP Router 是一個基于 MCP 官方 SDK 開發的標準 MCP Server&#xff0c;為 MCP Client 提供 MCP Server 的智能搜索、安裝、代理等功能&#xff0c;極大地簡化了 MCP 服務的使用流程。同時&#xff0c;Nacos MCP Router 跟…

【趙渝強老師】Redis的主從復制集群

Redis的主從復制是指將一臺Redis服務器的數據&#xff0c;復制到其他的Redis服務器。前者稱為Master主節點&#xff0c;后者稱為Slave從節點。數據的復制是單向的&#xff0c;只能由主節點到從節點。在默認情況下每臺Redis服務器都是主節點。一個主節點可以有多個從節點或者沒有…