29. 中介者模式

定義

中介者模式(Mediator Pattern):用一個(gè)中介對(duì)象(中介者)來(lái)封裝一系列的對(duì)象交互,中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。中介者模式又稱為調(diào)停者模式。

通俗理解

中介,在生活中經(jīng)常聽(tīng)得到的詞匯。租房子的時(shí)候,我們會(huì)找租房的中介;買房子的時(shí)候,我們會(huì)找買房的中介;找對(duì)象的時(shí)候,我們會(huì)去找紅娘等等。通常我們都會(huì)給中介一點(diǎn)費(fèi)用,然后中介會(huì)根據(jù)我們的要求給我們找好相關(guān)的東西,我們所需要的只是簽一個(gè)字就可以了,簡(jiǎn)直是簡(jiǎn)化了我們的生活呀。

現(xiàn)在有些中介真是煩人,我們已經(jīng)租了房子了,但是還是會(huì)有其他的中介打電話過(guò)來(lái),問(wèn)我們是不是需要租房子,不勝其擾。有時(shí)候我們會(huì)抱怨中介的費(fèi)用太高,也許租一個(gè)房子只需要2000一個(gè)月的,但是我們給中介的費(fèi)用就需要3000,不能忍。但是,即使是這樣,我們有沒(méi)有想過(guò),如果這個(gè)世界沒(méi)有中介了,那么會(huì)發(fā)生什么事情?

第一,我們必須任何的事情都親力親為了,找房子,我們需要一家一家地去和房東溝通,和他們談判;搬家,只能去找街頭的面包車師傅搬運(yùn),然后被面包車師傅宰了一頓,也全然不知。第二,我們不能搞混和這些人的身份,房東是房東,面包車師傅是面包車師傅,把房租交個(gè)面包車師傅(只是個(gè)比喻,一般不會(huì)出現(xiàn)這種事故),那就貽笑大方了。

中介者模式就是這樣的一個(gè)模式。系統(tǒng)中的對(duì)象,和中介進(jìn)行交互,形成一種星型結(jié)構(gòu),而不是彼此交互,對(duì)象A調(diào)用對(duì)象B,對(duì)象B調(diào)用對(duì)象C,形成一個(gè)網(wǎng)狀結(jié)構(gòu)。而且,引入中介,是迪米特法則的典型應(yīng)用。

示例

按照租房子,買房子,找對(duì)象為業(yè)務(wù)。

渣渣程序

租房子、買房子、找對(duì)象。

public class RentRoom {
    public void rentRoom() {
        System.out.println("租房子");
    }
}
public class BuyRoom {
    public void buyRoom() {
        System.out.println("買房子");
    }
}
public class FindObject {
    public void findObject() {
        System.out.println("找對(duì)象");
    }
}

程序入口

public class Main {
    public static void main(String[] args) {
        RentRoom rentRoom = new RentRoom();
        BuyRoom buyRoom = new BuyRoom();
        FindObject findObject = new FindObject();

        rentRoom.rentRoom();
        buyRoom.buyRoom();
        findObject.findObject();
    }
}
//租房子
//買房子
//找對(duì)象

上面只是簡(jiǎn)化后的一個(gè)寫(xiě)法,如果考慮買房子前必須要租房幾年,找對(duì)象必須要買房子,買房子后要把租的房子退掉,找了對(duì)象之后也可以住在租的房子里面的情況... ... 那么造成對(duì)象之間的結(jié)構(gòu)變復(fù)雜,并增加耦合度;組件難重用,租房都已經(jīng)耦合了買房、找對(duì)象之類的方法,不是單純的租房,其他系統(tǒng)調(diào)用只是想租房而已,為什么還需要找對(duì)象和買房呢?而且擴(kuò)展性差,增加一個(gè)新的對(duì)象,也需要把這個(gè)對(duì)象耦合進(jìn)去,這個(gè)網(wǎng)越織越大,最后亂糟糟一團(tuán)。

優(yōu)化

類圖

程序

系統(tǒng)對(duì)象與實(shí)現(xiàn)

public interface Colleague {
    void operation();
}
public class BuyRoom implements Colleague {
    public void buyRoom() {
        System.out.println("買房子");
    }
    public void operation() {
        buyRoom();
    }
}
//RentRoom、FindObject類似,省略

中介者接口與實(shí)現(xiàn)

public interface Mediator {
    void operation(Colleague colleague);
}
public class ConcreteMediator implements Mediator {
    public void operation(Colleague colleague) {
        colleague.operation();
    }
}

調(diào)用

public class Main {
    public static void main(String[] args) {
        Colleague rendRoom = new RentRoom();
        Mediator mediator = new ConcreteMediator();
        mediator.operation(rendRoom);
    }
}
//租房子

這樣,以后對(duì)象之間的調(diào)用,只需要引入Mediator就可以實(shí)現(xiàn)調(diào)用。

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

  1. 簡(jiǎn)化調(diào)用,由原來(lái)對(duì)象和對(duì)象之間的多對(duì)多調(diào)用變成了對(duì)象和中介類的一對(duì)一的調(diào)用;
  2. 解耦合,加入新的對(duì)象,只需要在在中介類中添加相關(guān)的方法即可;
  3. 減少子類的生成。

缺點(diǎn)

  1. 中介類復(fù)雜。

應(yīng)用場(chǎng)景

  1. 系統(tǒng)中存在復(fù)雜的引用關(guān)系,結(jié)構(gòu)混亂難理解;
  2. 一個(gè)類中應(yīng)用了其他類,難做到復(fù)用;
  3. 通過(guò)中間類來(lái)封裝多個(gè)類中的行為。

程序

e29_mediator_pattern

吐槽

又是封一層。

http://www.itdecent.cn/p/8aebc296f3ad

最后編輯于
?著作權(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ù)。

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