Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 《Android源碼設計模式解析與實戰》讀書筆記(十七)

《Android源碼設計模式解析與實戰》讀書筆記(十七)

編輯:關於android開發

《Android源碼設計模式解析與實戰》讀書筆記(十七)


第十七章、中介者模式

中介者模式也稱為調解者模式或調停者模式,是一種行為型模式。

1.定義

中介者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使它們可以松散耦合。當某些對象之間的作用發生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。

2.使用場景

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

3.UML類圖

這裡寫圖片描述

(1)Mediator:抽象中介者角色,定義了同事對象到中介者對象的接口,一般以抽象類的方式實現。

(2)ConcreteMediator:具體中介者角色,繼承於抽象中介者,實現了父類定義的方法,它從具體的同事對象接受消息,向具體同事對象發出命令。

(3)Colleague:抽象同事類角色,定義了中介者對象的接口,它只知道中介者而不知道其他的同事對象。

(4)ConcreteColleague1、ConcreteColleague2:具體同事類角色,繼承於抽象同事類,每個具體同事類都知道本身在小范圍的行為,而不知道在大范圍內的目的。

4.簡單實現

在電腦中,主機部分主要分為:CPU、內存、顯卡、IO設備,而將它們整合起來的就是主板,這裡主板就是一個中介者。以此為例。

抽象中介者:

public abstract class Mediator {

    /**
     * 同事對象改變時通知中介者的方法
     * 在同事對象改變時由中介者去通知其他的同事對象
     * 
     * @param c 同事對象
     */
    public abstract void changed(Colleague c);
}

抽象同事:

public abstract class Colleague {
    protected Mediator mediator;//每一個同事都該知道其中介者

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

}

CPU同事:

public class CPU extends Colleague{

    private String dataVideo, dataSound; //視頻和音頻數據

    public CPU(Mediator mediator) {
        super(mediator);
    }

    /**
     * 獲取視頻數據
     * 
     * @return 視頻數據
     */
    public String getDataVideo(){
        return dataVideo;
    }

    /**
     * 獲取音頻數據
     * 
     * @return 音頻數據
     */
    public String getDataSound(){
        return dataSound;
    }

    /**
     * 解碼數據
     * 
     * @param data音、視頻數據
     */
    public void decodeData(String data){
        //分割音、視頻數據
        String[] tmp = data.split(",");

        //解析音、視頻數據
        dataVideo = tmp[0];
        dataSound = tmp[1];

        //告訴中介者自身狀態改變
        mediator.changed(this);
    }
}

光驅同事:

public class CDDevice extends Colleague{

    private String data; //視頻數據

    public CDDevice(Mediator mediator) {
        super(mediator);
    }

    /**
     * 讀取視頻數據
     * 
     * @return 視頻數據
     */
    public String read(){
        return data;
    }

    /**
     * 加載視頻數據
     * 
     * @return 音頻數據
     */
    public void load(){
        data = "視頻數據,音頻數據";
        //告訴中介者自身狀態改變
        mediator.changed(this);
    }
}

顯卡同事:

public class GraphicsCard extends Colleague{

    public GraphicsCard(Mediator mediator) {
        super(mediator);
    }

    /**
     * 播放視頻數據
     * 
     * @param 視頻數據
     */
    public void videoPlay(String data){
        System.out.println("視頻:" + data);
    }
}

聲卡同事:

public class SoundCard extends Colleague{

    public SoundCard(Mediator mediator) {
        super(mediator);
    }

    /**
     * 播放音頻數據
     * 
     * @param 音頻數據
     */
    public void soundPlay(String data){
        System.out.println("音頻:" + data);
    }
}

主板中介者:

public class MainBoard extends Mediator{

    private CDDevice cdDevice; //光驅設備
    private CPU cpu; //CPU
    private SoundCard soundCard; //聲卡設備
    private GraphicsCard graphicsCard; //顯卡設備

    @Override
    public void changed(Colleague c) {
        //如果光驅讀取了數據
        if(c == cdDevice){
            handleCD((CDDevice) c);
        }
        //如果CPU處理完數據
        else if(c == cpu){
            handleCD((CPU) c);
        }
    }

    /**
     * 處理光驅讀取數據後與其他設備的交互
     * 
     * @param cdDevice 光驅設備
     */
    public void handleCD(CDDevice cdDevice){
        cpu.decodeData(cdDevice.read());
    }

    /**
     * 處理CPU讀取數據後與其他設備的交互
     * 
     * @param cpu CPU
     */
    public void handleCD(CPU cpu){
        soundCard.soundPlay(cpu.getDataSound());
        graphicsCard.videoPlay(cpu.getDataVideo());
    }

    /**
     * 設置CD設備
     * 
     * @param CDDevice CD設備
     */
    public void setCDDevice(CDDevice cdDevice){
        this.cdDevice = cdDevice;
    }

    /**
     * 設置CPU
     * 
     * @param cpu CPU
     */
    public void setCPU(CPU cpu){
        this.cpu = cpu;
    }

    /**
     * 設置聲卡設備
     * 
     * @param soundCard 聲卡設備
     */
    public void setSoundCard(SoundCard soundCard){
        this.soundCard = soundCard;
    }

    /**
     * 設置顯卡設備
     * 
     * @param graphicsCard 顯卡設備
     */
    public void setGraphicsCard(GraphicsCard graphicsCard){
        this.graphicsCard = graphicsCard;
    }
}

播放電影:

public class Client {

    public static void main(String[] args) {
        //構造主板對象
        MainBoard mediator = new MainBoard();

        //分別構造各個零件
        CDDevice cd = new CDDevice(mediator);
        CPU cpu = new CPU(mediator);
        GraphicsCard gc = new GraphicsCard(mediator);
        SoundCard sc = new SoundCard(mediator);

        //將各個零件安裝到主板
        mediator.setCDDevice(cd);
        mediator.setCPU(cpu);
        mediator.setGraphicsCard(gc);
        mediator.setSoundCard(sc);

        //播放電影
        cd.load();
    }

}

結果:

音頻:音頻數據
視頻:視頻數據

可以看出中介者模式將多對多的相互作用轉化為一對多的相互作用,將系統從網狀結構變為以中介者為中心的星形結構(這裡就是主板),達到降低系統的復雜性,提高可擴展性。

5.Android源碼中的中介者模式

6.總結

其實在Android開發中我們可能無意間就使用了中介者模式,比如登錄注冊界面,我們使用EditText的addTextChangedListener監聽輸入密碼的位數、用戶名是否為空,密碼與確認密碼是否一致等等判斷時,此時多個控件交互,就是由Activity充當中介者來協調。

1.優點

(1)適當地使用中介者模式可以避免同事類之間的過度耦合,使得各同事類之間可以相對獨立地使用。

(2)使用中介者模式可以將對象的行為和協作進行抽象,能夠比較靈活的處理對象間的相互作用。

(3)使用中介者模式可以將對象間多對多的關聯轉變為一對多的關聯,使對象間的關系易於理解和維護。

2.缺點

中介者模式是一種比較常用的模式,也是一種比較容易被濫用的模式。對於大多數的情況,同事類之間的關系不會復雜到混亂不堪的網狀結構,因此,大多數情況下,將對象間的依賴關系封裝的同事類內部就可以的,沒有必要非引入中介者模式。濫用中介者模式,只會讓事情變的更復雜。所以,我們決定使用中介者模式之前要多方考慮、權衡利弊。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved