【設計模式】中介者模式:設計模式中的解耦神器!!(附上demo)
偶然間看到了一個之前完全沒有關注過的設計模式——中介者模式,在看過該設計模式的應用場景後,便有了相見恨晚的感覺啊!!!
這麼屌的設計模式應該應用很廣泛呀!!可怎麼之前都沒怎麼聽過?難道是我之前以為『中介者模式』==『代理模式』嗎????不過話說回來,只看名字的話,很多人都會以為這兩個是同一種設計模式吧……
廢話不多說,我們接下來介紹下這個非常屌的設計模式。這裡是demo(傳送門)。
一、應用場景
『中介者模式』的設計初衷就是為了各個互相關聯的模組之間的解耦。如果在業務場景中,幾個模組會相互影響,那你會怎麼設計程式呢?
在知道中介者模式之前,我能想到的就是回撥……舉個栗子,在之前做日曆頁開發時,日曆頁主要
- PriceCalendarDelegate(日曆模組)
- MultilineDelegate(多專案模組)
- MultiTravelDelegate(多行程模組)
- NumberBoxDelegate(人數選擇模組)
- FooterDelegate(底部模組)
這五個模組可以說是非常緊密地關聯在一起。下面是全部模組的展示圖。
當我們選中一個日期,比如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面試題:介紹Hadoop中RPC協議,以及底層用什麼框架封裝的
用於將使用者請求中的引數或者應答轉換成位元組流以便跨機傳輸。 函式呼叫層:函式呼叫層主要功能是:定位要呼叫的函式,並執行該函式,Hadoop採用了java的反射機制和動態代理實現了函式的呼叫。 網路傳輸層:網路傳輸層描述了Client和Server之間訊息的傳輸方式,Hadoop採用了基
【Java併發程式設計】之二十:併發新特性—Lock鎖和條件變數(含程式碼)
簡單使用Lock鎖 Java 5中引入了新的鎖機制——java.util.concurrent.locks中的顯式的互斥鎖:Lock介面,它提供了比synchronized更加廣泛的鎖定操作。Lock介面有3個實現它的類:ReentrantLock、Reetrant
【論文閱讀】《Delta TFIDF:An 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設計模式之——策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式(行為型)【讀書筆記】
一、策略模式 定義:定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到演算法的客戶。 使用場景:策略模式是一種定義一系列演算法的方法,從概念上看,所有的這些演算法完成的都是相同的工作,只是實現不