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

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...