Android的設(shè)計模式-中介者模式

前言

Android的設(shè)計模式系列文章介紹侦高,歡迎關(guān)注霸饲,持續(xù)更新中:

Android的設(shè)計模式-設(shè)計模式的六大原則
一句話總結(jié)23種設(shè)計模式則
創(chuàng)建型模式:
Android的設(shè)計模式-單例模式
Android的設(shè)計模式-建造者模式
Android的設(shè)計模式-工廠方法模式
Android的設(shè)計模式-簡單工廠模式
Android的設(shè)計模式-抽象工廠模式
Android的設(shè)計模式-原型模式
行為型模式:
Android的設(shè)計模式-策略模式
Android的設(shè)計模式-狀態(tài)模式
Android的設(shè)計模式-責任鏈模式
Android的設(shè)計模式-觀察者模式
Android的設(shè)計模式-模板方法模式
Android的設(shè)計模式-迭代器模式
Android的設(shè)計模式-備忘錄模式
Android的設(shè)計模式-訪問者模式
Android的設(shè)計模式-中介者模式
Android的設(shè)計模式-解釋器模式
Android的設(shè)計模式-命令模式
結(jié)構(gòu)型模式:
Android的設(shè)計模式-代理模式
Android的設(shè)計模式-組合模式
Android的設(shè)計模式-適配器模式
Android的設(shè)計模式-裝飾者模式
Android的設(shè)計模式-享元模式
Android的設(shè)計模式-外觀模式
Android的設(shè)計模式-橋接模式

1.定義

用一個中介者對象來封裝一系列的對象交互。中介者使得各對象不需要顯式地相互引用秧饮,從而使其松散耦合傅事,而且可以獨立地改變它們之間的交互。

2.介紹

  • 中介者模式屬于行為型模式旁趟。
  • 中介者模式也稱為調(diào)解者模式或者調(diào)停者模式昼激。
  • 當程序存在大量的類時庇绽,多個對象之間存在著依賴的關(guān)系锡搜,呈現(xiàn)出網(wǎng)狀結(jié)構(gòu),那么程序的可讀性和可維護性就變差了瞧掺,并且修改一個類需要牽涉到其他類耕餐,不符合開閉原則。


    網(wǎng)狀結(jié)構(gòu).jpg

    因此我們可以引入中介者辟狈,將網(wǎng)狀結(jié)構(gòu)轉(zhuǎn)化成星型結(jié)構(gòu)肠缔,可以降低程序的復(fù)雜性,并且可以減少各個對象之間的耦合哼转。


    星型結(jié)構(gòu).jpg

3.UML類圖

中介者模式UML類圖.jpg
角色說明:
  • Mediator(抽象中介者角色):抽象類或者接口,定義統(tǒng)一的接口明未,用于各同事角色之間的通信。
  • ConcreteMediator(具體中介者角色):繼承或者實現(xiàn)了抽象中介者壹蔓,實現(xiàn)了父類定義的方法,協(xié)調(diào)各個具體同事進行通信趟妥。
  • Colleague(抽象同事角色):抽象類或者接口,定義統(tǒng)一的接口,它只知道中介者而不知道其他同事對象佣蓉。
  • ConcreteColleague(具體同事角色):繼承或者實現(xiàn)了抽象同事角色披摄,每個具體同事類都知道自己本身的行為,其他的行為只能通過中介者去進行勇凭。

4.實現(xiàn)

說到中介者疚膊,肯定就想到了房屋中介,下面以房屋中介為例虾标,房東通過中介發(fā)布出售信息寓盗,中介就會把房屋信息傳遞給有這需求的購房者,購房者再通過中介去看房買房等等璧函。

4.1 創(chuàng)建抽象同事角色

無論是房東還是購房者贞让,他們都能夠發(fā)布信息和接受信息:

    public abstract class Person {//人物類
        protected HouseMediator houseMediator;

        public Person(HouseMediator houseMediator) {
            this.houseMediator = houseMediator;//獲取中介
        }

        public abstract void send(String message);//發(fā)布信息

        public abstract void getNotice(String message);//接受信息
    }
4.2 創(chuàng)建具體同事角色

下面分別創(chuàng)建一個房東類和一個買房者類:

    public class Purchaser extends Person {//買房者類,繼承Person
        public Purchaser(HouseMediator houseMediator) {
            super(houseMediator);
        }

        @Override
        public void send(String message) {
            System.out.println("買房者發(fā)布信息:" + message);
            houseMediator.notice(this, message);
        }

        @Override
        public void getNotice(String message) {
            System.out.println("買房者收到消息:" + message);
        }
    }

    public class Landlord extends Person {//房東者類柳譬,繼承Person
        public Landlord(HouseMediator houseMediator) {
            super(houseMediator);
        }

        @Override
        public void send(String message) {
            System.out.println("房東發(fā)布信息:" + message);
            houseMediator.notice(this, message);
        }

        @Override
        public void getNotice(String message) {
            System.out.println("房東收到消息:" + message);
        }
    }
4.3 創(chuàng)建抽象中介者角色

這里就是房屋中介喳张,定義一個通知的方法:

     public interface HouseMediator {//房屋中介類
        void notice(Person person, String msg);//通知方法
    }
4.4 創(chuàng)建具體中介者角色

具體的房屋中介,以鏈家為例美澳,他們能從房東和買房者獲得信息销部,然后做出不同的行為:

    public class Lianjia implements HouseMediator {//鏈家,實現(xiàn)HouseMediator
        Purchaser mPurchaser;
        Landlord mLandlord;

        public void setPurchaser(Purchaser purchaser) {//設(shè)置買房者
            mPurchaser = purchaser;
        }

        public void setLandlord(Landlord landlord) {//設(shè)置房東
            mLandlord = landlord;
        }


        @Override
        public void notice(Person person, String message) {//發(fā)送通知
            System.out.println("中介收到信息制跟,并轉(zhuǎn)發(fā)給相應(yīng)的目標人群");
            if (person == mPurchaser) {
                mLandlord.getNotice(message);
            } else if (person == mLandlord) {
                mPurchaser.getNotice(message);
            }
        }
    }
4.5 客戶端測試:
     public void test() {
        Lianjia houseMediator = new Lianjia();
        Purchaser purchaser = new Purchaser(houseMediator);
        Landlord landlord = new Landlord(houseMediator);
        houseMediator.setLandlord(landlord);
        houseMediator.setPurchaser(purchaser);

        landlord.send("出售一套別墅");
        System.out.println("------------------------");
        purchaser.send("求購一套學區(qū)房");
    }
輸出結(jié)果:
房東發(fā)布信息:出售一套別墅
中介收到信息舅桩,并轉(zhuǎn)發(fā)給相應(yīng)的目標人群
買房者收到消息:出售一套別墅
------------------------
買房者發(fā)布信息:求購一套學區(qū)房
中介收到信息,并轉(zhuǎn)發(fā)給相應(yīng)的目標人群
房東收到消息:求購一套學區(qū)房

5. 應(yīng)用場景

  • 在程序中雨膨,如果類的依賴關(guān)系過于復(fù)雜擂涛,呈現(xiàn)網(wǎng)狀的結(jié)構(gòu),可以使用中介者模式對其進行解耦聊记。

6. 優(yōu)點

  • 降低類的關(guān)系復(fù)雜度撒妈,將多對多轉(zhuǎn)化成一對多恢暖,實現(xiàn)解耦。
  • 符合迪米特原則狰右,依賴的類最少杰捂。

7. 缺點

  • 同事類越多,中介者的邏輯就越復(fù)雜棋蚌,會變得越難維護嫁佳。
  • 如果本來類的依賴關(guān)系不復(fù)雜,但是使用了中介者會使原來不復(fù)雜的邏輯變得復(fù)雜谷暮。因此需要根據(jù)實際情況去考慮蒿往,不要濫用中介者。

8. Android中的源碼分析

Android中的鎖屏功能就用到了中介者模式湿弦,KeyguardService(鎖屏服務(wù))通過KeyguardViewMediator(鎖屏中介者)來協(xié)調(diào)各種Manager的狀態(tài)以達到鎖屏的功能熄浓。這里KeyguardService和各種Manager等等都充當了同事的角色。

8.1 KeyguardService的源碼

    public class KeyguardService extends Service {//鎖屏服務(wù)省撑,同事角色

        private KeyguardViewMediator mKeyguardViewMediator;//鎖屏中介者

        @Override
        public void onCreate() {
            ((SystemUIApplication) getApplication()).startServicesIfNeeded();
            //初始化中介者
            mKeyguardViewMediator = ((SystemUIApplication) getApplication()).getComponent(KeyguardViewMediator.class);
        }

        private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub() {

            @Override // Binder interface
            public void addStateMonitorCallback(IKeyguardStateCallback callback) {
                checkPermission();

                mKeyguardViewMediator.addStateMonitorCallback(callback);//調(diào)用中介者的接口
            }

            @Override // Binder interface
            public void verifyUnlock(IKeyguardExitCallback callback) {
                checkPermission();

                mKeyguardViewMediator.verifyUnlock(callback);//調(diào)用中介者的接口
            }
            
            //其他代碼略
            
        };
    }

8.2 KeyguardViewMediator的源碼

    public class KeyguardViewMediator extends SystemUI {//鎖屏中介者
        //各種Manager
        private AlarmManager mAlarmManager;
        private AudioManager mAudioManager;
        private StatusBarManager mStatusBarManager;
        private PowerManager mPM;
        private IWindowManager mWM;
        private TrustManager mTrustManager;
        private SearchManager mSearchManager;
        private PowerManager.WakeLock mShowKeyguardWakeLock;
        private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;

        //其他代碼略

        private void playSound(int soundId) {//通過AudioManager去播放聲音
            if (soundId == 0) return;
            final ContentResolver cr = mContext.getContentResolver();
            if (Settings.System.getInt(cr, Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 1) == 1) {

                mLockSounds.stop(mLockSoundStreamId);
                // Init mAudioManager
                if (mAudioManager == null) {
                    mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
                    if (mAudioManager == null) return;
                    mUiSoundsStreamType = mAudioManager.getUiSoundsStreamType();
                }
                // If the stream is muted, don't play the sound
                if (mAudioManager.isStreamMute(mUiSoundsStreamType)) return;

                mLockSoundStreamId = mLockSounds.play(soundId,
                        mLockSoundVolume, mLockSoundVolume, 1/*priortiy*/, 0/*loop*/, 1.0f/*rate*/);
            }
        }
        
    }

KeyguardViewMediator中通過playSound方法能夠協(xié)調(diào)AudioManager去控制聲音的播放等等赌蔑,其他Manager同理。

相關(guān)文章閱讀
Android的設(shè)計模式-設(shè)計模式的六大原則
一句話總結(jié)23種設(shè)計模式則
創(chuàng)建型模式:
Android的設(shè)計模式-單例模式
Android的設(shè)計模式-建造者模式
Android的設(shè)計模式-工廠方法模式
Android的設(shè)計模式-簡單工廠模式
Android的設(shè)計模式-抽象工廠模式
Android的設(shè)計模式-原型模式
行為型模式:
Android的設(shè)計模式-策略模式
Android的設(shè)計模式-狀態(tài)模式
Android的設(shè)計模式-責任鏈模式
Android的設(shè)計模式-觀察者模式
Android的設(shè)計模式-模板方法模式
Android的設(shè)計模式-迭代器模式
Android的設(shè)計模式-備忘錄模式
Android的設(shè)計模式-訪問者模式
Android的設(shè)計模式-中介者模式
Android的設(shè)計模式-解釋器模式
Android的設(shè)計模式-命令模式
結(jié)構(gòu)型模式:
Android的設(shè)計模式-代理模式
Android的設(shè)計模式-組合模式
Android的設(shè)計模式-適配器模式
Android的設(shè)計模式-裝飾者模式
Android的設(shè)計模式-享元模式
Android的設(shè)計模式-外觀模式
Android的設(shè)計模式-橋接模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竟秫,一起剝皮案震驚了整個濱河市娃惯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肥败,老刑警劉巖趾浅,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馒稍,居然都是意外死亡皿哨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門纽谒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來证膨,“玉大人,你說我怎么就攤上這事鼓黔⊙肜眨” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵澳化,是天一觀的道長崔步。 經(jīng)常有香客問我,道長缎谷,這世上最難降的妖魔是什么井濒? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上瑞你,老公的妹妹穿的比我還像新娘酪惭。我一直安慰自己,他們只是感情好捏悬,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布撞蚕。 她就那樣靜靜地躺著润梯,像睡著了一般过牙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纺铭,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天寇钉,我揣著相機與錄音,去河邊找鬼舶赔。 笑死扫倡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的竟纳。 我是一名探鬼主播撵溃,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锥累!你這毒婦竟也來了缘挑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤桶略,失蹤者是張志新(化名)和其女友劉穎语淘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體际歼,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡惶翻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹅心。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吕粗。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖旭愧,靈堂內(nèi)的尸體忽然破棺而出溯泣,到底是詐尸還是另有隱情,我是刑警寧澤榕茧,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布垃沦,位于F島的核電站,受9級特大地震影響用押,放射性物質(zhì)發(fā)生泄漏肢簿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望池充。 院中可真熱鬧桩引,春花似錦、人聲如沸收夸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卧惜。三九已至厘灼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咽瓷,已是汗流浹背设凹。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茅姜,地道東北人闪朱。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像钻洒,于是被迫代替她去往敵國和親奋姿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容