成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一起學(xué)設(shè)計(jì)模式 - 中介者模式

denson / 1225人閱讀

摘要:在地球上最大的中介者就是聯(lián)合國(guó)了,它主要用來維護(hù)國(guó)際和平與安全解決國(guó)際間經(jīng)濟(jì)社會(huì)文化和人道主義性質(zhì)的問題。所以對(duì)于關(guān)系比較復(fù)雜的系統(tǒng),我們?yōu)榱藴p少對(duì)象之間的關(guān)聯(lián)關(guān)系,使之成為一個(gè)松耦合系統(tǒng),我們就需要使用中介者模式。

中介者模式(Mediator Pattern)屬于行為型模式的一種,用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。

概述

在我們的生活中處處充斥著中介者,比如租房、買房、出國(guó)留學(xué)、找工作、旅游等等可能都需要那些中介者的幫助,同時(shí)我們也深受其害,高昂的中介費(fèi),虛假信息。在地球上最大的中介者就是聯(lián)合國(guó)了,它主要用來維護(hù)國(guó)際和平與安全、解決國(guó)際間經(jīng)濟(jì)、社會(huì)、文化和人道主義性質(zhì)的問題。國(guó)與國(guó)之間的關(guān)系異常復(fù)雜,會(huì)因?yàn)楦鞣N各樣的利益關(guān)系來結(jié)成盟友或者敵人,熟話說沒有永遠(yuǎn)的朋友,也沒有永遠(yuǎn)的敵人,只有永遠(yuǎn)的利益!所以國(guó)與國(guó)之間的關(guān)系同樣會(huì)隨著時(shí)間、環(huán)境因?yàn)槔娑l(fā)生改變。在我們軟件的世界也同樣如此,對(duì)象與對(duì)象之間存在著很強(qiáng)、復(fù)雜的關(guān)聯(lián)關(guān)系,如果沒有類似于聯(lián)合國(guó)這樣的“機(jī)構(gòu)”會(huì)很容易出問題的,譬如:

1、 對(duì)象與對(duì)象之間存在大量的關(guān)聯(lián)關(guān)系,這樣勢(shì)必會(huì)導(dǎo)致系統(tǒng)的結(jié)構(gòu)變得很復(fù)雜,同時(shí)若一個(gè)對(duì)象發(fā)生改變,我們也需要跟蹤與之相關(guān)聯(lián)的對(duì)象,同時(shí)做出相應(yīng)的處理。

2、 對(duì)象之間的連接增加會(huì)導(dǎo)致對(duì)象可復(fù)用性降低。

3、 系統(tǒng)的可擴(kuò)展性低。增加一個(gè)新的對(duì)象,我們需要在其相關(guān)連的對(duì)象上面加上引用,這樣就會(huì)導(dǎo)致系統(tǒng)的耦合性增高,使系統(tǒng)的靈活性和可擴(kuò)展都降低。

在前面我就知道如果兩個(gè)類不必彼此通信,那么這兩個(gè)類就不應(yīng)當(dāng)發(fā)生直接關(guān)聯(lián)的關(guān)系。如果其中一個(gè)類需要調(diào)用另一個(gè)類中的方法,我們可以通過第三方來轉(zhuǎn)發(fā)這個(gè)調(diào)用。所以對(duì)于關(guān)系比較復(fù)雜的系統(tǒng),我們?yōu)榱藴p少對(duì)象之間的關(guān)聯(lián)關(guān)系,使之成為一個(gè)松耦合系統(tǒng),我們就需要使用中介者模式。

通過中介者模式,我們可以將復(fù)雜關(guān)系的網(wǎng)狀結(jié)構(gòu)變成結(jié)構(gòu)簡(jiǎn)單的以中介者為核心的星形結(jié)構(gòu),每個(gè)對(duì)象不再和它與之關(guān)聯(lián)的對(duì)象直接發(fā)生相互作用,而是通過中介者對(duì)象來另一個(gè)對(duì)象發(fā)生相互作用。

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

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

Mediator(抽象中介者): 定義了同事對(duì)象到中介者對(duì)象之間的接口

ConcreteMediator(具體中介者): 實(shí)現(xiàn)抽象中介者的方法,它需要知道所有的具體同事類,同時(shí)需要從具體的同事類那里接收信息,并且向具體的同事類發(fā)送信息。

Colleague(抽象同事類): 它定義各個(gè)同事類公有的方法,并聲明了一些抽象方法來供子類實(shí)現(xiàn),同時(shí)維持了一個(gè)對(duì)抽象中介者類的引用,其子類可以通過該引用來與中介者通信。

ConcreteColleague(具體同事類): 抽象同事類的子類;每個(gè)同事對(duì)象在與其他同事對(duì)象通信時(shí),先與中介者通信,通過中介者來間接完成與其他同事類的通信;在具體同事類中實(shí)現(xiàn)了在抽象同事類中聲明的抽象方法。

案例

以租房為例,這里中介機(jī)構(gòu)充當(dāng)租房者與房屋所有者之間的中介者。UML結(jié)構(gòu)圖:

UML圖如下:

1.定義抽象中介者

interface Mediator {

    /**
     * 讓對(duì)象之間通訊
     * @param content 傳遞的內(nèi)容
     * @param person  傳遞的對(duì)象
     */
    void contact(String content, AbstractPerson person);

}

2.定義抽象同事類AbstractPerson

abstract class AbstractPerson {

    protected String name;
    protected Mediator mediator;

    AbstractPerson(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }

    public abstract void receiveMessage(String msg);

}

3.分別定義房東租客類,繼承抽象同事類

class HouseOwner extends AbstractPerson {

    HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }

    public void contact(String message) {
        mediator.contact(message, this);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println("房主:" + name + ",獲得信息:" + message);
    }
}

class Tenant extends AbstractPerson {

    Tenant(String name, Mediator mediator) {
        super(name, mediator);
    }

    public void contact(String message) {
        mediator.contact(message, this);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println("租客:" + name + ",獲得信息:" + message);
    }
}

4.創(chuàng)建具體中介者,抽象的實(shí)現(xiàn),用來協(xié)調(diào)各個(gè)同事之間調(diào)用

class MediatorStructure implements Mediator {

    private HouseOwner houseOwner;
    private Tenant tenant;

    public HouseOwner getHouseOwner() {
        return houseOwner;
    }

    public void setHouseOwner(HouseOwner houseOwner) {
        this.houseOwner = houseOwner;
    }

    public Tenant getTenant() {
        return tenant;
    }

    public void setTenant(Tenant tenant) {
        this.tenant = tenant;
    }

    @Override
    public void contact(String message, AbstractPerson person) {
        //如果是房主,則租房者獲得信息
        if (person == houseOwner) {
            tenant.receiveMessage(message);
        } else {
            //反正則是房主獲得信息
            houseOwner.receiveMessage(message);
        }
    }
}

5.創(chuàng)建客戶端測(cè)試

public class Client {

    public static void main(String[] args) {
        //一個(gè)房主、一個(gè)租房者、一個(gè)中介機(jī)構(gòu)
        MediatorStructure mediator = new MediatorStructure();

        HouseOwner owner = new HouseOwner("小唐", mediator);
        Tenant tenant = new Tenant("小李", mediator);

        mediator.setHouseOwner(owner);
        mediator.setTenant(tenant);

        tenant.contact("房東您好,請(qǐng)問還有三室兩廳出粗嗎.....");
        owner.contact("還有!你需要租嗎?");

    }
}

6.運(yùn)行結(jié)果

房主:小唐,獲得信息:房東您好,請(qǐng)問還有三室兩廳出粗嗎.....
租客:小李,獲得信息:還有!你需要租嗎?
總結(jié)

在中介者模式中通過引用中介者對(duì)象,將系統(tǒng)中有關(guān)的對(duì)象所引用的其他對(duì)象數(shù)目減少到最少。它簡(jiǎn)化了系統(tǒng)的結(jié)構(gòu),將系統(tǒng)由負(fù)責(zé)的網(wǎng)狀結(jié)構(gòu)轉(zhuǎn)變成簡(jiǎn)單的星形結(jié)構(gòu),中介者對(duì)象在這里起到中轉(zhuǎn)和協(xié)調(diào)作用。

中介者類是中介者模式的核心,它對(duì)整個(gè)系統(tǒng)進(jìn)行控制和協(xié)調(diào),簡(jiǎn)化了對(duì)象之間的交互,還可以對(duì)對(duì)象間的交互進(jìn)行進(jìn)一步的控制。

通過使用中介者模式,具體的同事類可以獨(dú)立變化,通過引用中介者可以簡(jiǎn)化同事類的設(shè)計(jì)和實(shí)現(xiàn)。

就是由于中介者對(duì)象需要知道所有的具體同事類,封裝具體同事類之間相互關(guān)系,導(dǎo)致中介者對(duì)象變得非常復(fù)雜,系統(tǒng)維護(hù)起來較為困難。

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

簡(jiǎn)化了對(duì)象之間的關(guān)系,將系統(tǒng)的各個(gè)對(duì)象之間的相互關(guān)系進(jìn)行封裝,將各個(gè)同事類解耦,使系統(tǒng)成為松耦合系統(tǒng)。

減少了子類的生成。

減少各同事類的設(shè)計(jì)與實(shí)現(xiàn)。

缺點(diǎn)

中介者會(huì)龐大,變得復(fù)雜難以維護(hù)。

JDK中應(yīng)用

Mediator模式在事件驅(qū)動(dòng)類應(yīng)用中比較多,例如聊天、消息傳遞等等,需要有一個(gè)MessageMediator,專門負(fù)責(zé)request/reponse之間任務(wù)的調(diào)節(jié)。

JDK的具體應(yīng)用:

- java.util.Timer
- java.util.concurrent.Executor#execute()
- java.util.concurrent.ExecutorService#submit()
- java.lang.reflect.Method#invoke()
說點(diǎn)什么

參考文獻(xiàn):http://www.cnblogs.com/JsonShare/p/7263876.html

全文代碼:https://gitee.com/battcn/design-pattern/tree/master/Chapter15/battcn-mediator

個(gè)人QQ:1837307557

battcn開源群(適合新手):391619659

微信公眾號(hào):battcn(歡迎調(diào)戲)

福利

關(guān)注公眾號(hào):battcn,回復(fù)springboot即可獲得 <2017最新spring boot 外賣實(shí)戰(zhàn)微信公眾平臺(tái)視頻教程>

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70715.html

相關(guān)文章

  • 一起學(xué)設(shè)計(jì)模式 - 觀察者模式

    摘要:觀察者模式是一種使用頻率非常高的設(shè)計(jì)模式,無論是移動(dòng)應(yīng)用應(yīng)用或者桌面應(yīng)用,觀察者模式幾乎無處不在,它為實(shí)現(xiàn)對(duì)象之間的聯(lián)動(dòng)提供了一套完整的解決方案,凡是涉及到一對(duì)一或者一對(duì)多的對(duì)象交互場(chǎng)景都可以使用觀察者模式。 觀察者模式(Observer Pattern)屬于對(duì)象行為型模式的一種,定義對(duì)象之間的一種一對(duì)多依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生改變時(shí),其相關(guān)依賴對(duì)象皆得到通知并被自動(dòng)更新。 ...

    cpupro 評(píng)論0 收藏0
  • 練就Java24章真經(jīng)—你所不知道的工廠方法

    摘要:用專業(yè)的話來講設(shè)計(jì)模式是一套被反復(fù)使用多數(shù)人知曉的經(jīng)過分類編目的代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)創(chuàng)建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。工廠方法模式的擴(kuò)展性非常優(yōu)秀。工廠方法模式是典型的解耦框架。 前言 最近一直在Java方向奮斗《終于,我還是下決心學(xué)Java后臺(tái)了》,今天抽空開始學(xué)習(xí)Java的設(shè)計(jì)模式了。計(jì)劃有時(shí)間就去學(xué)習(xí),你這么有時(shí)間,還不來一起上車嗎? 之所以要學(xué)...

    Chiclaim 評(píng)論0 收藏0
  • 設(shè)計(jì)模式在jdk中的應(yīng)用

    摘要:本文只是尋找設(shè)計(jì)模式在中的應(yīng)用。來補(bǔ)全這一塊工廠模式中的應(yīng)用包線程池解釋和代碼線程池中有線程創(chuàng)建工廠。狀態(tài)模式中的應(yīng)用解釋和代碼根據(jù)一個(gè)指針的狀態(tài)而改變自己的行為適配器模式中的應(yīng)用解釋和代碼將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。 前言 最近重學(xué)設(shè)計(jì)模式,而且還有很多源碼要看。所以就想一舉兩得。從源碼中尋找設(shè)計(jì)模式。順便還可以看看源碼。。。本文只是尋找設(shè)計(jì)模式在java中的應(yīng)用。優(yōu)...

    dingding199389 評(píng)論0 收藏0
  • 實(shí)用模式介者模式

    摘要:好,師傅我們要學(xué)習(xí)帝吧人民,進(jìn)能打,退能刷淘寶。恩,大致過程就是這樣,我們使用中介者模式想一想。首先,數(shù)據(jù)需要放在中介者模式內(nèi),用戶的一切操作,都會(huì)傳遞給中介者模式,由他來選擇是哪一個(gè)部分發(fā)生改變。 俗話說,一個(gè)模式三個(gè)坑。 中介者模式應(yīng)該算最坑的一個(gè)模式,坑不在于他的原理。而在于他的名字和其他模式的使用,真尼瑪像。首先,中介者 好像是一切模式里面都有的一個(gè)東西,比如,享元模式中-元對(duì)...

    AlexTuan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<