中介者模式

定義

中介者模式包裝了一系列對(duì)象相互調(diào)用的方式,使得這些對(duì)象不必明顯相互作用。從而使它們可以松散耦合。當(dāng)某些對(duì)象之間的耦合發(fā)生改變時(shí),不會(huì)立即影響其他的一些對(duì)象之間的作用。保證這些對(duì)象可以彼此獨(dú)立變化。
中介者模式將多對(duì)多的相互作用轉(zhuǎn)化為一對(duì)多的相互作用。
中介者模式將對(duì)象的行為和協(xié)作抽象化,把對(duì)象在小尺度上與其他對(duì)象的相互作用分開(kāi)處理。

使用場(chǎng)景

當(dāng)對(duì)象之間的交互操作很多且每個(gè)對(duì)象的行為操作都相互彼此依賴時(shí),為防止在修改一個(gè)對(duì)象的行為時(shí),同時(shí)涉及修改很多其他對(duì)象的行為,可以采用中介者模式來(lái)解決緊湊耦合問(wèn)題。

Android中中介者模式最常見(jiàn)的場(chǎng)景莫過(guò)于view之間的聯(lián)動(dòng)了。

模式結(jié)構(gòu)

  • Mediator 抽象中介者角色
    定義了同事對(duì)象到中介者對(duì)象的接口,一般以抽象的方式實(shí)現(xiàn)
  • ConcreteMediator 具體中介者角色
    繼承于抽象中介者,實(shí)現(xiàn)了父類定義的方法,它具體的同事對(duì)象接收消息,向具體的同事對(duì)象發(fā)出命令
  • Colleague 抽象同事類角色
    定義了中介者對(duì)象的接口,它只知道中介者而不知道其他的同事對(duì)象
  • ConcreteColleagueA/B 具體同事類角色
    繼承于抽象同事類,每個(gè)具體同事類都知道本身在小范圍內(nèi)的行為,而不知道它在大范圍內(nèi)的目的

簡(jiǎn)單實(shí)現(xiàn)

public abstract class Mediator {

    public abstract void change(Colleague c);
}

抽象中介者M(jìn)ediator

public abstract class Colleague {
    protected Mediator mediator;

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

抽象同事Colleague

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;
    }
}

主板中介者M(jìn)ainBoard,充當(dāng)具體中介者角色,負(fù)責(zé)計(jì)算機(jī)各個(gè)組件的協(xié)調(diào)調(diào)度

public class CDDevice extends Colleague {

    private String data;

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

    public String read() {
        return data;
    }

    public void load() {
        data = "視頻,音頻數(shù)據(jù)流";
        mediator.change(this);
    }
}

CD設(shè)備,模擬音視頻源文件的寫(xiě)入


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類,解釋計(jì)算機(jī)指令以及處理計(jì)算機(jī)軟件中的數(shù)據(jù),這里模擬得到音視頻流數(shù)據(jù)

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) {

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

        // 構(gòu)造零件
        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();
    }
}

客戶類調(diào)用結(jié)果:

音頻:音頻數(shù)據(jù)流
視頻:視頻

Process finished with exit code 0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容