中介者模式

中介者模式

##定義 中介者模式包裝了一系列對象相互調用的方式,使得這些對象沒必要明顯相互做用。從而使它們能夠鬆散耦合。當某些對象之間的耦合發生改變時,不會當即影響其餘的一些對象之間的做用。保證這些對象能夠彼此獨立變化。 中介者模式將多對多的相互做用轉化爲一對多的相互做用。 中介者模式將對象的行爲和協做抽象化,把對象在小尺度上與其餘對象的相互做用分開處理。 ##使用場景 當對象之間的交互操做不少且每一個對象的行爲操做都相互彼此依賴時,爲防止在修改一個對象的行爲時,同時涉及修改不少其餘對象的行爲,能夠採用中介者模式來解決緊湊耦合問題。bash

Android中中介者模式最多見的場景莫過於view之間的聯動了。ide

##模式結構ui

  • Mediator 抽象中介者角色 定義了同事對象到中介者對象的接口,通常以抽象的方式實現
  • ConcreteMediator 具體中介者角色 繼承於抽象中介者,實現了父類定義的方法,它具體的同事對象接收消息,向具體的同事對象發出命令
  • Colleague 抽象同事類角色 定義了中介者對象的接口,它只知道中介者而不知道其餘的同事對象
  • ConcreteColleagueA/B 具體同事類角色 繼承於抽象同事類,每一個具體同事類都知道自己在小範圍內的行爲,而不知道它在大範圍內的目的

##簡單實現this

public abstract class Mediator {

    public abstract void change(Colleague c);
}

複製代碼

抽象中介者Mediatorspa

public abstract class Colleague {
    protected Mediator mediator;

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

複製代碼

抽象同事Colleaguecode

public class MainBoard extends Mediator {

    private CDDevice cdDevice;
    private CPU cpu;
    private SoundCard soundCard;
    private GraphicsCard graphicsCard;

    @Override
    public void change(Colleague c) {
        if (c == cdDevice) {
            handleCD((CDDevice) c);
        } else if (c == cpu) {
            handleCPU((CPU) c);
        }
    }

    private void handleCD(CDDevice cdDevice) {
        cpu.decodeData(cdDevice.read());
    }

    private void handleCPU(CPU cpu) {
        soundCard.soundPlay(cpu.getDataSound());
        graphicsCard.videoPlay(cpu.getDataVideo());
    }


    public void setCdDevice(CDDevice cdDevice) {
        this.cdDevice = cdDevice;
    }

    public void setCpu(CPU cpu) {
        this.cpu = cpu;
    }

    public void setSoundCard(SoundCard soundCard) {
        this.soundCard = soundCard;
    }

    public void setGraphicsCard(GraphicsCard graphicsCard) {
        this.graphicsCard = graphicsCard;
    }
}

複製代碼

主板中介者MainBoard,充當具體中介者角色,負責計算機各個組件的協調調度視頻

public class CDDevice extends Colleague {

    private String data;

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

    public String read() {
        return data;
    }

    public void load() {
        data = "視頻,音頻數據流";
        mediator.change(this);
    }
}
複製代碼

CD設備,模擬音視頻源文件的寫入對象

public class CPU extends Colleague {

    private String dataVideo, dataSound;

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

    public String getDataVideo() {
        return dataVideo;
    }

    public String getDataSound() {
        return dataSound;
    }

    public void decodeData(String data) {
        String[] tmp = data.split(",");

        dataVideo = tmp[0];

        dataSound = tmp[1];

        mediator.change(this);
    }
}

複製代碼

CPU類,解釋計算機指令以及處理計算機軟件中的數據,這裏模擬獲得音視頻流數據繼承

public class GraphicsCard extends Colleague {
    public GraphicsCard(Mediator mediator) {
        super(mediator);
    }

    public void videoPlay(String data) {
        System.out.println("視頻:" + data);
    }
}

複製代碼

顯卡類SoundCard,模擬顯示圖像信息接口

public class SoundCard extends Colleague {
    public SoundCard(Mediator mediator) {
        super(mediator);
    }

    public void soundPlay(String data){
        System.out.println("音頻:" + data);
    }
}

複製代碼

聲卡類SoundCard,模擬播放音頻信息

public class Client {

    public static void main(String[] args) {

        //構造主板
        MainBoard mainBoard = new MainBoard();

        // 構造零件
        CDDevice cd = new CDDevice(mainBoard);
        CPU cpu = new CPU(mainBoard);
        GraphicsCard gc = new GraphicsCard(mainBoard);
        SoundCard sc = new SoundCard(mainBoard);

        //零件安裝到主板
        mainBoard.setCdDevice(cd);
        mainBoard.setCpu(cpu);
        mainBoard.setGraphicsCard(gc);
        mainBoard.setSoundCard(sc);

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

複製代碼

客戶類調用結果:

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

Process finished with exit code 0
複製代碼
相關文章
相關標籤/搜索