中介者模式

概述

用一個中介者對象封裝一系列的對象交互,中介者使各對象不需要顯示地相互作用,從而使耦合松散,而且可以獨立地改變它們之間的交互。

實現一個中介者模式

我們來實現生活中一個常見的中介例子:計算機播放視頻,通過CD讀取視頻數據-->交給CPU解析-->通過顯卡和聲卡輸出。

不用中介者模式實現過程:
1.客戶端調用播放視頻方法;
2.CD讀取數據,把數據傳給CPU,通知CPU解析數據;
3.CPU解析數據,把解析后的視頻數據傳給顯卡并通知顯卡輸出視頻,把音頻數據傳給聲卡并通知聲卡輸出音頻;
4.顯卡輸出視頻;
5.聲卡輸出音頻;

用中介者模式實現過程:
1.客戶端調用播放視頻方法;
2.主板通知CD讀取數據;
3.CD讀取數據,把數據傳給主板,通知主板讀取完成;
4.主板把數據傳給CPU,通知CPU解析數據;
5.CPU解析數據,把解析后的數據傳給主板,通知主板解析完成;
6.主板把解析后的視頻數據傳給顯卡,通知顯卡輸出視頻數據;
7.主板把解析后的音頻數據傳給聲卡,通知聲卡輸出音頻數據;
8.顯卡輸出視頻;
9.聲卡輸出音頻;

1.定義一個同事接口

public abstract class Colleague {
    protected MainBoard mMainBoard;

    public Colleague(MainBoard mainBoard) {
        mMainBoard = mainBoard;
    }
    
}

2.定義CD,CPU,顯卡,聲卡

public class CD extends Colleague{
    //CD內置的音視頻數據
    private static final String MEDIA_DATA="原始視頻數據";
    private static final String SOUND_DATA="原始音頻數據";

    public CD(MainBoard mainBoard) {
        super(mainBoard);
    }
    
    public void load(){
        mMainBoard.setmMediaData(MEDIA_DATA);
        mMainBoard.setmSoundData(SOUND_DATA);
        mMainBoard.hasDone(this);
    }

}

public class CPU extends Colleague{

    public CPU(MainBoard mainBoard) {
        super(mainBoard);
    }
    
    /**
     * 解析視頻音頻數據
     */
    public void decode(){
        mMainBoard.setmDecodeMediaData(mMainBoard.getmMediaData().replace("原始", ""));
        mMainBoard.setmDecodeSoundData(mMainBoard.getmSoundData().replace("原始", ""));
        mMainBoard.hasDone(this);
    }

}

public class GraphicCard extends Colleague{

    public GraphicCard(MainBoard mainBoard) {
        super(mainBoard);
    }
    
    /**
     * 播放視頻
     * @param string
     */
    public void play(){
        System.out.println(mMainBoard.getmDecodeMediaData());
    }

}

public class SoundCard extends Colleague{

    public SoundCard(MainBoard mainBoard) {
        super(mainBoard);
    }

    /**
     * 播放音頻
     * @param string
     */
    public void play(){
        System.out.println(mMainBoard.getmDecodeSoundData());
    }
}

3.定義一個主板

public class MainBoard {
    private String mMediaData;// 原始視頻數據
    private String mSoundData;// 原始音頻數據
    private String mDecodeMediaData;// 解析后的視頻數據
    private String mDecodeSoundData;// 解析后的音頻數據

    private CD mCD;
    private CPU mCPU;
    private GraphicCard mGraphicCard;
    private SoundCard mSoundCard;

    public void setmCD(CD mCD) {
        this.mCD = mCD;
    }

    public void setmCPU(CPU mCPU) {
        this.mCPU = mCPU;
    }

    public void setmGraphicCard(GraphicCard mGraphicCard) {
        this.mGraphicCard = mGraphicCard;
    }

    public void setmSoundCard(SoundCard mSoundCard) {
        this.mSoundCard = mSoundCard;
    }

    public String getmDecodeMediaData() {
        return mDecodeMediaData;
    }

    public void setmDecodeMediaData(String mDecodeMediaData) {
        this.mDecodeMediaData = mDecodeMediaData;
    }

    public String getmDecodeSoundData() {
        return mDecodeSoundData;
    }

    public void setmDecodeSoundData(String mDecodeSoundData) {
        this.mDecodeSoundData = mDecodeSoundData;
    }

    public String getmMediaData() {
        return mMediaData;
    }

    public void setmMediaData(String mMediaData) {
        this.mMediaData = mMediaData;
    }

    public String getmSoundData() {
        return mSoundData;
    }

    public void setmSoundData(String mSoundData) {
        this.mSoundData = mSoundData;
    }

    public void hasDone(Colleague colleague) {
        if (colleague == mCD) {
            mCPU.decode();
        } else if (colleague == mCPU) {
            mGraphicCard.play();
            mSoundCard.play();
        }
    }

    public void play() {
        mCD.load();
    }
}

4.最后加入一個客戶端

public class Client {
    public static void main(String[] args) {
        MainBoard mainBoard=new MainBoard();
        mainBoard.setmCD(new CD(mainBoard));
        mainBoard.setmCPU(new CPU(mainBoard));
        mainBoard.setmGraphicCard(new GraphicCard(mainBoard));
        mainBoard.setmSoundCard(new SoundCard(mainBoard));
        mainBoard.play();
    }
}

5.執行結果

image.png

總結

中介者模式用CPU來解釋:不用中介者模式的情況下,CPU需要從CD獲取數據,解析完成后再傳給顯卡和聲卡。用中介者模式,CPU只需要從主板獲取數據,解析完在拋給主板。這不就是概述中的“中介者使各對象不需要顯示地相互作用,從而使耦合松散”嗎。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容