Android常見設(shè)計(jì)模式十三:中介模式

對于開發(fā)人員來說,設(shè)計(jì)模式有時候就是一道坎,但是設(shè)計(jì)模式又非常有用,過了這道坎,它可以讓你水平提高一個檔次。而在android開發(fā)中,必要的了解一些設(shè)計(jì)模式又是必須的,因?yàn)樵O(shè)計(jì)模式在Android源碼中,可以說是無處不在。對于想系統(tǒng)的學(xué)習(xí)設(shè)計(jì)模式的同學(xué),這里推薦一本書,《大話設(shè)計(jì)模式》。


Android常用設(shè)計(jì)模式系列:

面向?qū)ο蟮幕A(chǔ)特征
面向?qū)ο蟮脑O(shè)計(jì)原則
單例模式
模板模式
適配器模式
工廠模式
代理模式
原型模式
策略模式
Build模式
觀察者模式
裝飾者模式
中介模式
門面模式


一、中介者模式

中介者模式又叫調(diào)解者模式或調(diào)停者模式,是行為型設(shè)計(jì)模式之一。

生活中的中介者的作用就是連接兩方的一個橋梁,比如房產(chǎn)中介,買房的只需跟中介打交道,然后買房的也跟著中介打交道,

沒有中介的時候是這樣的:


每個買房的和賣房的都要和很多對方打交道,有了新的買房人,這些賣房的都得知道才能去和他聯(lián)系。

有了中介者之后:

所有買房的和賣房的都只需要跟中介者一個人打交道,買房的不需要知道賣房的是什么人,有多少賣房的等等。都省事了很多。

定義

通過中介者包裝一系列對象的交互,使得這些對象不必相互顯式引用,從而使它們可以松散耦合。且可以獨(dú)立地改變它們之間的交互。中介者模式又叫調(diào)停模式,它是迪米特法則的典型應(yīng)用。

當(dāng)某些對象之間的作用發(fā)生變化是,不會立即影響其他對象間的作用,保證這些作用協(xié)議彼此獨(dú)立的變化。

中介者模式將多對多的相互作用轉(zhuǎn)化為一對多的相互作用。

使用場景

多個對象之間的交互操作很多,每個對象的行為都依賴批次,形成網(wǎng)狀的多對多結(jié)構(gòu),為了防止修改一個對象時要修改很多其他對象,可以用中介者模式。

UML


Mediator: 抽象的中介者角色,定義了同事對象到中介者的接口。

ConcreteMediator:具體的中介者角色,從具體的同事對象接收消息,同時向具體的同事對象發(fā)出命令。

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

ConcreteColleagueA,B:具體的同事類角色,每個具體同事類都知道本身在小范圍內(nèi)的行為,而不知道他在大范圍中的行為。
模板代碼:

抽象的中介者:

public interface Mediator {
    void change();
}

具體的中介者:

public class ConcreteMediator implements Mediator {
    public ConcreteColleagueA concreteColleagueA;
    public ConcreteColleagueB concreteColleagueB;

    public void setConcreteColleagueA(ConcreteColleagueA concreteColleagueA) {
        this.concreteColleagueA = concreteColleagueA;
    }

    public void setConcreteColleagueB(ConcreteColleagueB concreteColleagueB) {
        this.concreteColleagueB = concreteColleagueB;
    }

    @Override
    public void change() {
        concreteColleagueA.action();
        concreteColleagueB.action();
    }
}

抽象的同事:

public abstract class Colleague {
    public Mediator mediator;

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

具體的同事:

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

    @Override
    public void action() {
        System.out.println("交給中介做A的事情");
    }
}
public class ConcreteColleagueB extends Colleague {
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void action() {
        System.out.println("交給中介做B的事情");
    }
}

二、簡單實(shí)現(xiàn)

以電腦為例子。CPU,顯卡,內(nèi)存等零件的交互都是通過主板實(shí)現(xiàn)的,而且每個零件只需要做好自己的工作,不需要知道其他零件是什么。所以主板可以作為他們的中介者。

抽象的中介者:

public abstract class Mediator {
    public abstract void change(Colleague colleague);
}

具體的中介者,主板:

public class MainBoard extends Mediator {
    private CDDevice cdDevice;
    private CPU cpu;
    private GraphicsCard graphicsCard;
    private SoundCard soundCard ;
    @Override
    public void change(Colleague colleague) {
        if (colleague==cdDevice){
            handleCD((CDDevice) colleague);
        }
        if (colleague==cpu){
            handleCPU((CPU) colleague);
        }
    }
    private void handleCD(CDDevice  cdDevice){
        cpu.decodeData(cdDevice.read());
    }
    private void handleCPU(CPU cpu){
        soundCard.playSound(cpu.getDataSound());
        graphicsCard.vidoePlay(cpu.getDataVideo());
    }

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

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

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

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

抽象的零件:

public abstract class Colleague {
    public Mediator mediator;

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

具體的零件:

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

    //解析數(shù)據(jù),分割音頻和視頻
    public void decodeData(String data){
        String[] tmp = data.split(",");
        dataVideo=tmp[0];
        dataSound=tmp[1];
        mediator.change(this);
    }
}
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ù),音頻數(shù)據(jù)";
        mediator.change(this);
    }
}
public class GraphicsCard extends Colleague {
    public GraphicsCard(Mediator mediator) {
        super(mediator);
    }

    public void vidoePlay(String data){
        System.out.println("播放視頻:"+data);
    }
}
public class SoundCard extends Colleague {
    public SoundCard(Mediator mediator) {
        super(mediator);
    }

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

}

總結(jié)

如果一個系統(tǒng)中對象之間的聯(lián)系呈現(xiàn)為網(wǎng)狀結(jié)構(gòu),對象之間存在大量多對多關(guān)系,將導(dǎo)致關(guān)系及其復(fù)雜,這些對象稱為“同事對象”
-我們可以引入一個中介者對象,使各個同事對象只跟中介者對象打交道,將復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)化解為如下的星形結(jié)構(gòu)


中介者模式

在面向?qū)ο缶幊讨校粋€類必然會與其他類產(chǎn)生依賴關(guān)系,當(dāng)依賴關(guān)系錯綜復(fù)雜時,可以考慮用中介者模式進(jìn)行解耦。

優(yōu)點(diǎn)

降低類的關(guān)系復(fù)雜度,將多對多轉(zhuǎn)化成一對多,實(shí)現(xiàn)解耦。
符合迪米特原則(最少知識原則)

缺點(diǎn)

中介者要做很多事,會變得龐大且難以維護(hù)。
如果本來關(guān)系并不復(fù)雜,那么使用中介者可能會讓關(guān)系變得更復(fù)雜。

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

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

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