1. 程式人生 > >【設計模式】中介者模式:設計模式中的解耦神器!!(附上demo)

【設計模式】中介者模式:設計模式中的解耦神器!!(附上demo)

偶然間看到了一個之前完全沒有關注過的設計模式——中介者模式,在看過該設計模式的應用場景後,便有了相見恨晚的感覺啊!!!

這麼屌的設計模式應該應用很廣泛呀!!可怎麼之前都沒怎麼聽過?難道是我之前以為『中介者模式』==『代理模式』嗎????不過話說回來,只看名字的話,很多人都會以為這兩個是同一種設計模式吧……

廢話不多說,我們接下來介紹下這個非常屌的設計模式。這裡是demo(傳送門)。

一、應用場景

『中介者模式』的設計初衷就是為了各個互相關聯的模組之間的解耦。如果在業務場景中,幾個模組會相互影響,那你會怎麼設計程式呢?

在知道中介者模式之前,我能想到的就是回撥……舉個栗子,在之前做日曆頁開發時,日曆頁主要

被分為五個模組:

  • PriceCalendarDelegate(日曆模組)
  • MultilineDelegate(多專案模組)
  • MultiTravelDelegate(多行程模組)
  • NumberBoxDelegate(人數選擇模組)
  • FooterDelegate(底部模組)

這五個模組可以說是非常緊密地關聯在一起。下面是全部模組的展示圖。
日曆頁模組效果圖.jpg
當我們選中一個日期,比如4月18號時,多線路模組、多行程模組、人數選擇模組都需要跟著改變。
那麼我的程式是怎麼寫的呢?

override fun onDateSelected(dayStrObj: String, priceStr: Int?, productPrices: List<ProductPrice>?) {
        //底部模組重新整理
PriceCalendarUtil.setSuccessFetchPrice(true, mPresenter) mFooterDelegate?.refresh(true) //多線路模組重新整理 if (PriceCalendarUtil.isTour(mPresenter) && PriceCalendarUtil.isMultiLine(mPresenter)) { mMultiTravelDelegate?.refresh(dayStrObj, null) mMultiLineDelegate?.refresh(dayStrObj, productPrices) return
} //多行程模組重新整理 if (PriceCalendarUtil.isTour(mPresenter)) { mMultiTravelDelegate?.refresh(dayStrObj, productPrices) } //優惠券模組重新整理 requestPriceAndCoupon(dayStrObj, priceStr) }

這個是選擇完日期後的回撥,在這個回撥裡,多行程模組、優惠券模組、底部模組、多線路模組都需要重新重新整理

這只是Fragment中的一個回撥,由於日曆頁的各個模組都需要關聯起來,這樣的回撥還有好多。紅框框出來的都是回撥。
這裡寫圖片描述

二、有了中介者模式之後,我們的程式碼該怎麼寫呢?

由於日曆頁的程式碼量很大,不適合理解中介者模式的精髓,我們來寫個demo。
在demo裡有三個Delegate:

  • DelegateA
    這裡寫圖片描述
  • DelegateB
    這裡寫圖片描述
  • DelegateC
    這裡寫圖片描述
  • BaseDelegate
    這裡寫圖片描述
    這三個Delegate就相當於三個模組,另外BaseDelegate是它們的父類。
    除了這三個Delegate,還有一箇中介者Mediator。
    這裡寫圖片描述
    接下來只需要在Activity裡初始化一下三個Delegate和一個Mediator就行了。
    這裡寫圖片描述
    我們看到,在Activity裡再也沒有了那麼多冗餘的回撥,我們可以直接在各個業務模組裡去更改其他模組了

    這樣的程式碼層次更清晰,也更有可讀性!!

    好了,讀到這裡如果你已經get到了『中介者模式』有多屌了,就跟我來具體瞭解下這個設計模式吧~~~

三、中介者模式詳解

1. 定義

如果一個系統中物件之間存在多對多的相互關係,我們可以將物件之間的一些互動行為從物件中分離出來,集中封裝在一箇中介者物件中,由中介者同一協調。

2. 使用場景:

當物件之間的互動操作很多且每個物件的行為操作都依賴彼此時,為防止在修改一個物件的行為時,同時涉及很多其他物件的行為,可使用中介者模式。

3. UML類圖

這裡寫圖片描述
這是我在網上找的一張類圖。。。。由於現在已經快12點了,之後有時間再自己畫一張吧。。。

四、總結

八個字概括:
模組解耦!!中介者模式!!

五、參考

相關推薦

開發工具JAVA效能分析7、超詳細的JProfiler堆分析官方中文版

堆分析——The Heap Walker 一、堆快照——Heap snapshots 涉及物件之間引用的任何堆分析都需要堆快照,因為無法向JVM詢問對物件的傳入引用是什麼 - 您必須遍歷整個堆來回答該問題。從該堆快照,JProfiler建立一個內部資料庫,該資料庫經過優化,可以生成在堆wal

開發工具JAVA效能分析6、超詳細的JProfiler記憶體分析官方中文版

Memory Profiling——記憶體分析 有兩種方法可以獲取有關堆上物件的資訊。一方面,分析代理可以跟蹤每個物件的分配和垃圾收集。在JProfiler中,這稱為“分配記錄”。它告訴您已分配物件的位置,還可用於建立有關臨時物件的統計資訊。另一方面,JVM的分析介面允許分析代理採用“堆快照”,

開發工具JAVA效能分析4、超詳細的JProfiler遙測分析官方中文版

Telemetries——遙測資料 分析的一個方面是監視隨時間的標量測量,例如使用的堆大小。在JProfiler中,這種圖形稱為遙測。通過觀察遙測,您可以更好地瞭解配置檔案,允許您將重要事件與不同測量值相關聯,並且如果發現意外行為,可能會提示您使用JProfiler中的其他檢視進行更深入的分析。

開發工具JAVA效能分析3、超詳細的JProfiler快照分析官方中文版

Snapshots——快照分析 到目前為止,我們只查看了JProfiler GUI從配置檔案JVM中執行的效能分析代理獲取資料的實時會話。JProfiler還支援將所有分析資料寫入檔案的快照。在以下幾種情況下,這可能是有利的: 您可以自動記錄分析資料,例如作為測試的一部分,以便無法連線

開發工具JAVA效能分析2、超詳細的JProfiler資料分析官方中文版

此頁是根據官方的英文版進行的對照翻譯。重要資訊用紅色加粗進行了標記。 Recording Data——記錄資料 一、Scalar values and telemetries          從分析器的角度來看,最不成問題的資料形式是標

設計模式中介模式設計模式神器附上demo

偶然間看到了一個之前完全沒有關注過的設計模式——中介者模式,在看過該設計模式的應用場景後,便有了相見恨晚的感覺啊!!! 這麼屌的設計模式應該應用很廣泛呀!!可怎麼之前都沒怎麼聽過?難道是我之前以為『中介者模式』==『代理模式』嗎????不過話說回來,只看名字的

一起學設計模式中介模式+觀察模式+備忘錄模式實戰提交個訂單我到底經歷了什麼鬼?

前言 再多的話就不說了,這個是接著上一講: 【一起學設計模式】狀態模式+裝飾器模式+簡單工廠模式實戰:(一)提交個訂單我到底經歷了什麼鬼? 一起的,一些多餘的贅述請先看這個篇文章。 業務場景 一圖流,還是上一篇文章中一樣的圖,接下來我們就梳理下總結模式、觀察者模式、備忘錄模式的應用: 訂單中心: 1、訂單

設計模式中介模式

col com fin 每一個 mediator std 一對一 類的方法 -1 1、 定義 1.1 標準定義 中介者模式的定義為:Define an object that encapsulates how a set of objectsinteract.Med

設計模式學習筆記14狀態模式State

public class GumballMachine { State soldOutState; State noQuarterState; State hasQuarterState; State soldState; State state = soldOutState; int c

設計模式第九篇組合模式解決層級關係結構問題

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/881cf6509c104530b1668727374a9fab~tplv-k3u1fbpfcp-zoom-1.image) 說明:此文章兩個示例中,公司結構的示例思路來自於《大話設計模式》,內容以及

設計模式第十篇外觀模式,開著小破車的快樂

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6cc3b1afe0eb425197976764db0d545c~tplv-k3u1fbpfcp-zoom-1.image) # 一 開著小破車的快樂 不知道大家有沒有這樣開或者坐過這樣一輛“小破車

圖文詳細 HDFS面試題介紹HadoopRPC協議,以及底層用什麼框架封裝的

用於將使用者請求中的引數或者應答轉換成位元組流以便跨機傳輸。 函式呼叫層:函式呼叫層主要功能是:定位要呼叫的函式,並執行該函式,Hadoop採用了java的反射機制和動態代理實現了函式的呼叫。 網路傳輸層:網路傳輸層描述了Client和Server之間訊息的傳輸方式,Hadoop採用了基

Java併發程式設計之二十併發新特性—Lock鎖和條件變數含程式碼

簡單使用Lock鎖     Java 5中引入了新的鎖機制——java.util.concurrent.locks中的顯式的互斥鎖:Lock介面,它提供了比synchronized更加廣泛的鎖定操作。Lock介面有3個實現它的類:ReentrantLock、Reetrant

論文閱讀《Delta TFIDFAn Improved Feature Space for Sentiment Analysis》論文及實驗

Delta TFIDF 論文中提出了一種在文字分類之前給單詞加權的計算方法,並使用SVM對三個資料集進行情感分析。 方法 在詞袋模型中,每一個單詞或者n-gram字都與一個值相關聯。這些值通常都是文件中的數字。有時這些值會根據其對應單詞在文件中的統計特徵來進一步加權。相反,我

開發工具JAVA效能分析1、超詳細的JProfiler安裝使用具體資料分析見2

一、JProfiler簡單介紹 JProfiler是由ej-technologies GmbH公司開發的一款效能瓶頸分析工具(該公司還開發部署工具)。 其特點: 1、使用方便,介面操作友好 2、對被分析的應用影響小 3、CPU,Thread,Memory分析功能尤其強大,支援對jdb

智慧製造工信部《國家智慧製造標準體系建設指南2018年版徵求意見稿

據工信部1月15日訊息,為加快推進智慧製造綜合標準化工作,加強頂層設計,構建智慧製造綜合標準體系

金山雲機器學習演算法工程師2017年8月29號電話一面內推

Update1(2017-08-30): 同一個面試官面其他人問到的問題。 1、CNN 2、隨機森林 3、目標檢測演算法 4、CNN的各種架構和各個元件的作用 我只是很鬱悶,為什麼不問我這些?我很拿手

筆記二 EgretH5通用MVC框架的入門操作在scene製造一個彈出選單UI部分

前言:彈出選單是遊戲中UI非常常見的一個部件,下面將用筆記一中建立的scene進行構建,效果圖如下: 1.在\resource\skins\DemoSkin.exml檔案中新增: <e:Group width="610.61" height="192.42"

設計模式-代理模式、介面卡模式、橋接模式中介模式

前言    從字面意思上感覺代理、介面卡、橋接、中介者有很大的共性。通過這樣的對比學習讓我們深入瞭解一下這四種模式吧。 代理模式    為其他物件提供一種代理以控制對這個物件的訪問。使用者不想或者不能直接引用一個物件,而代理物件可以在使用者與物件之間起到中

java設計模式之——策略模式、模板方法模式、觀察模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式中介模式、直譯器模式行為型讀書筆記

一、策略模式           定義:定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到演算法的客戶。           使用場景:策略模式是一種定義一系列演算法的方法,從概念上看,所有的這些演算法完成的都是相同的工作,只是實現不