設(shè)計(jì)模式-中介者模式

在我們的日常生活中經(jīng)常需要購買各種各樣的東西,房子、車子、生活用品等等。那么我們并不會(huì)對(duì)各個(gè)產(chǎn)品都了解,所以銷售人員應(yīng)運(yùn)而生,他們了解產(chǎn)品,然后他們根據(jù)你的需求在向你們推薦符合你們要求的產(chǎn)品。這些銷售人員就相當(dāng)于中介,處于客戶和產(chǎn)品之間,為你們搭橋牽線。這就是這篇需要講述的一個(gè)設(shè)計(jì)模式-中介者模式。

介紹

從程序方面來講,中介者模式就是各個(gè)對(duì)象封裝,使他們不需要相互直接引用,而是通過中介者來通信。對(duì)于一個(gè)模塊,可能由很多對(duì)象構(gòu)成,而且這些對(duì)象之間可能存在相互的引用,為了減少對(duì)象兩兩之間復(fù)雜的引用關(guān)系,使之成為一個(gè)松耦合的系統(tǒng),我們需要使用中介者模式,這就是中介者模式的模式動(dòng)機(jī)。

如下圖(圖片來自大話設(shè)計(jì)模式)

圖片來自大話設(shè)計(jì)模式

聯(lián)合國就相當(dāng)于中介者模式中的中介者
圖片來自大話設(shè)計(jì)模式

結(jié)構(gòu)圖

圖片來自網(wǎng)絡(luò)

案例

中介抽象類

public abstract class Mediator {
    public abstract void handleMsg(String msg,Colleague colleague);
}

抽象同事類

public abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
    
    public abstract void getMsg(String msg);
    
    public abstract void sendMsg(String msg);
}

房東類(具體同事類)

public class Landlord extends Colleague {

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

    @Override
    public void getMsg(String msg) {
        System.out.println("我是一名房東,今天我收到一條消息:"+msg);
    }

    @Override
    public void sendMsg(String msg) {
        mediator.handleMsg(msg, this);
    }


}

租客類(具體同事類)

public class Renter extends Colleague {

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

    @Override
    public void getMsg(String msg) {
        System.out.println("我是一名租客,今天我收到一條消息:"+msg);
    }

    @Override
    public void sendMsg(String msg) {
        mediator.handleMsg(msg, this);
    }
}

房地產(chǎn)經(jīng)紀(jì)人中介類

public class Realtor extends Mediator {
    
    private Landlord landlord;
    private Renter renter;
    
    public void setLandlord(Landlord landlord) {
        this.landlord = landlord;
    }



    public void setRenter(Renter renter) {
        this.renter = renter;
    }



    @Override
    public void handleMsg(String msg, Colleague colleague) {
        //如果消息是房東發(fā)過來的,那就轉(zhuǎn)給租客,讓租客知道有人出租房屋
        if (colleague.equals(landlord)) {
            renter.getMsg(msg);
        }
        
        //如果消息是租客發(fā)過來的,說明租客已經(jīng)決定是否租賃房屋,把消息給房東(現(xiàn)實(shí)中沒這必要。。。)
        if (colleague.equals(renter)) {
            landlord.getMsg(msg);
        }
    }

}

測(cè)試類

public class Client {
    
    public static void main(String[] args) {
        //中介
        Realtor realtor = new Realtor();
        
        //房東和租客同時(shí)找上了中介
        Landlord landlord = new Landlord(realtor);
        Renter renter = new Renter(realtor);
        
        realtor.setLandlord(landlord);
        realtor.setRenter(renter);
        
        landlord.sendMsg("有一套海景別墅要出租!!!");
        renter.sendMsg("太貴,租不起!");
    }

}

代碼見Github地址

總結(jié)

如果在一個(gè)系統(tǒng)中對(duì)象之間的聯(lián)系呈現(xiàn)為網(wǎng)狀結(jié)構(gòu),也就是存在大量的多對(duì)多聯(lián)系時(shí)就可以用中介者模式。通過使用中介者模式可以把原來的網(wǎng)狀結(jié)構(gòu)變成星形結(jié)構(gòu),最上面那兩張圖,聯(lián)合國來作為中介,處理各國的事務(wù)。
中介者模式可以使對(duì)象之間的關(guān)系數(shù)量急劇減少,而且還承擔(dān)這兩方面的作用,一是中轉(zhuǎn)作用,而是協(xié)調(diào)作用。通過中介者提供的中轉(zhuǎn)作用,各個(gè)同事對(duì)象就不再需要顯式引用其他同事,當(dāng)需要和其他同事進(jìn)行通信時(shí),通過中介者即可。中介者可以更進(jìn)一步的對(duì)同事之間的關(guān)系進(jìn)行封裝,同事可以一致地和中介者進(jìn)行交互,而不需要指明中介者需要具體怎么做,中介者根據(jù)封裝在自身內(nèi)部的協(xié)調(diào)邏輯,對(duì)同事的請(qǐng)求進(jìn)行進(jìn)一步處理,將同事成員之間的關(guān)系行為進(jìn)行分離和封裝。
通過使用中介者模式可以降低了類的復(fù)雜度,將一對(duì)多轉(zhuǎn)化成了一對(duì)一,降低系統(tǒng)的耦合性。

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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