設計模式學習筆記(九:中介者模式)

来源:http://www.cnblogs.com/liuzhen1995/archive/2016/10/25/5996792.html
-Advertisement-
Play Games

1.1概述 用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。這就是中介者模式的定義。 一個對象含有另一個對象的引用是面向對象中經常使用的方式,也是面向對象所提倡的,即少用繼承多用組合。但是怎樣合理地組合對象對系統今後的擴展 ...


1.1概述

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

    一個對象含有另一個對象的引用是面向對象中經常使用的方式,也是面向對象所提倡的,即少用繼承多用組合。但是怎樣合理地組合對象對系統今後的擴展、維護和對象的復用是至關重要的,這也正是學習設計模式的重要原因。

    例如,在一個房屋租賃系統中,有很多對象,有些對象是求租者,有些是出租者,如果要求他們之間必須成為朋友才能進行有關租賃的操作,顯然不利於系統的維護和發展,因此,每當有新的出租者或求租者加入該系統,這個新的加入者必須和現有系統中的所有人互為朋友後才能和他們進行有關租賃的操作,這就意味著要修改大量的代碼,這對系統的維護是非常不利的也是無法容忍的。一個好的解決辦法就是在房屋租賃系統中建立一個稱作中介者的對象,中介者包含系統中所有其他對象的引用,而系統中的其他對象只包含中介者的引用,也就是說中介者和大家互為朋友、中介者使系統中的其他對象完全解耦,當系統中某個對象需要和系統中另外一個對象交互時,只需將自己的請求通知中介者即可,如果有新的加入者,該加入者只需含有中介者的引用,並讓中介者含有自己的引用,他就可以和系統中其他對象進行有關租賃操作,具體如下圖一所示:

 

 

圖一:中介者、出租者和求租者

    中介者模式是封裝一系列的對象交互的成熟模式,其關鍵是將對象之間的交互封裝在稱作中介者的對象中,中介者使各對象不需要顯示地相互吸引,這些對象只包含中介者的引用。當系統中某個對象需要和系統中另外一個對象交互時,只需要將自己的請求通知給中介者即可。

 

 

1.2模式的結構

中介者模式的結構包含四種角色:

(1)中介者(Mediator):中介者是一個介面,該介面定義了用於同事對象之間進行通信的方法。

(2)具體中介者(ConcreteMediator):具體中介者是實現中介者介面的類。具體中介者需要包含所有具體同事的引用,並通過實現中介者介面中的方法來滿足具體同事之間的通信請求。

(3)同事(Colleague):一個介面,規定了具體同事需要實現的方法。

(4)具體同事(ConcreteColleague):實現同事介面的類。具體同事需要包含具體中介者的引用,一個具體同事需要和其他具體同事交互時,只需要將自己的請求通知給它所包含的具體中介者即可。

中介者模式結構的類圖如下圖二所示:

 

 

圖二:中介者模式類圖

 

 

1.3中介者模式的優點

1)可以避免許多的對象為了通信而相互顯示引用,否則,不僅系統難於維護,而且也使其他系統難以復用這些對象。

2)可以通過中介者將原本分佈於多個對象之間的交互行為集中在一起。當這些對象之間需要改變之間的通信行為時,只需要使用一個具體中介者即可,不必修改各個具體同事的代碼,即這些同事可被重用。

3)具體中介者使得各個具體同事完全解耦,修改任何一個具體同事的代碼不會影響到其他同事。

4)具體中介者集中了同事之間是如何交互的細節,使系統比較清楚地知道整個系統中的同事是如何交互的。

5)當一些對象相互通信,但又無法相互包含對方的引用,那麼使用中介者模式就可以使這些對象相互通信。

 

1.4適合使用中介者模式的情景

 1)許多對象以複雜的方式交互,所導致的依賴關係使系統難以理解和維護。

 2)一個對象引用其他很多對象,導致難以復用該對象。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.輸入參數為單個值 delete from MemberAccessLog where accessTimestamp = #value# delete from MemberAccessLog where accessTimestamp = #value# 2.輸入參數為一個對象 ... ...
  • ord('a');//=>97 返回小寫a 的ascii碼值97 chr(97);//=>a 返回ascii碼表上的97對應的 小寫a ...
  • dedecms 基本包含了一個常規網站需要的一切功能,擁有完善的中文學習資料,很容易上手。學會dedecms 的模板修改、欄目新增、內容模型新增和常用的標簽調用方法後,即便我們不懂 php 語言也能獨立完成一個網站了。 在百度網盤中分享,織夢CMS模板製作手冊 http://pan.baidu.co ...
  • 回到目錄 一般sso的說明 在Lind.DDD框架里,有對單點登陸的集成,原理就是各個網站去sso網站統一登陸授權,之後在sso網站將登陸的token進行存儲,存儲方式隨你(cache,redis,mongodb,file),之後業務平臺在訪問資源時,如果這些資源需要用戶登陸才能訪問,就會去sso網 ...
  • 一、前言 筆者一直覺得,學習一個知識點,你首先要明白,這東西是什麼?有什麼用?這樣你才能瞭解。好了,不說廢話。 1.1、類型轉換為何存在?什麼是類型轉換? 在MVC框架中,都是屬於表示層解決方案,都需要負責收集用戶請求的參數,並且將請求參數傳給應用的控制器組件,但是,這裡有一個問題,客戶端提交的請求 ...
  • 設計模式系列-01-開篇 設計模式系列-02-創建模式-簡單工廠 文字恐懼者請看腦圖 http://naotu.baidu.com/file/7cdf927d18994f1543651245cac6c538?token=6dd2bea9552cf4f1 1.設計模式 設計模式(Design patt ...
  • 前言 在解決了上一次關於超級話題積分bug後,又接到超級話題簽到提醒的產品需求。這是一篇偏於技術實現的文章,講述的比較籠統,業務圍繞超級話題的簽到提醒進行展開。如果,您對超級話題簽到提醒的技術背景與實現感興趣,那麼這篇文章希望對你有幫助。 產品 最近,在忙活超級話題的簽到提醒產品的開發。首先,這是第 ...
  • 一、前言 之前便瞭解過,Struts 2的核心控制器是一個Filter過濾器,負責攔截所有的用戶請求,當用戶請求發送過來時,會去檢測struts.xml是否存在這個action,如果存在,伺服器便會自動幫我們跳轉到指定的處理類中去處理用戶的請求,基本流程如下: 該流程筆者理解是基本流程,。如果有不對 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...