【設計模式】中介者模式:設計模式中的解耦神器!!(附上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點了,之後有時間再自己畫一張吧。。。

四、總結

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

五、參考

https://www.cnblogs.com/ysw-go/p/5413958.html
https://blog.csdn.net/u012124438/article/details/70474166
https://blog.csdn.net/ztg1234/article/details/78359253

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章