溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何深入理解Java設(shè)計(jì)模式的中介者模式

發(fā)布時(shí)間:2021-11-05 17:51:18 來(lái)源:億速云 閱讀:140 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何深入理解Java設(shè)計(jì)模式的中介者模式,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

    一、什么是中介者模式

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

    中介者作為一種行為設(shè)計(jì)模式,它公開(kāi)一個(gè)統(tǒng)一的接口,系統(tǒng)的不同對(duì)象或組件可以通過(guò)該接口進(jìn)行通信。增加一個(gè)中介者對(duì)象后,所有的相關(guān)對(duì)象通過(guò)中介者對(duì)象來(lái)通信,而不是互相引用,所以當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí),只需要通知中介者對(duì)象即可。

    二、中介者模式的結(jié)構(gòu)

    如何深入理解Java設(shè)計(jì)模式的中介者模式

    Mediator:中介者接口。在里面定義各個(gè)同事之間交互需要的方法,可以是公共的通訊方法,比如changed方法,大家都用,也可以是小范圍的交互方法。

    ConcreteMediator:具體中介者實(shí)現(xiàn)對(duì)象。它需要了解并維護(hù)各個(gè)同事對(duì)象,并負(fù)責(zé)具體的協(xié)調(diào)各同事對(duì)象的交互關(guān)系。

    Colleague:同事類的定義,通常實(shí)現(xiàn)成為抽象類,主要負(fù)責(zé)約束同事對(duì)象的類型,并實(shí)現(xiàn)一些具體同事類之間的公共功能,比如:每個(gè)具體同事類都應(yīng)該知道中介者對(duì)象,也就是具體同事類都會(huì)持有中介者對(duì)象,就可以定義到這個(gè)類里面。

    ConcreteColleague:具體的同事類,實(shí)現(xiàn)自己的業(yè)務(wù),在需要與其它同事通訊的時(shí)候,就與持有的中介者通信,中介者會(huì)負(fù)責(zé)與其它的同事交互。

    三、中介者模式的優(yōu)缺點(diǎn)

    優(yōu)點(diǎn): 減少各個(gè)Colleague之間的耦合,使得可以獨(dú)立地改變和復(fù)用各個(gè)Colleague類和Mediator

    缺點(diǎn):中介者模式的缺點(diǎn)是顯而易見(jiàn)的,因?yàn)檫@個(gè)“中介“承擔(dān)了較多的責(zé)任,所以一旦這個(gè)中介對(duì)象出現(xiàn)了問(wèn)題,那么整個(gè)系統(tǒng)就會(huì)受到重大的影響。

    四、中介者模式的使用場(chǎng)景

    1. 一組定義良好的對(duì)象,現(xiàn)在要進(jìn)行復(fù)雜的通信。

    2. 定制一個(gè)分布在多個(gè)類中的行為,而又不想生成太多的子類。

    可以看出,中介對(duì)象主要是用來(lái)封裝行為的,行為的參與者就是那些對(duì)象,但是通過(guò)中介者,這些對(duì)象不用相互知道。

    五、中介者模式與發(fā)布/訂閱模式的異同

    1. 中介者模式與業(yè)務(wù)相關(guān),訂閱/發(fā)布模式與業(yè)務(wù)無(wú)關(guān)。

    2. 兩個(gè)模式都有集中調(diào)度效果,對(duì)象之間不直接參與通信。

    六、中介者模式的實(shí)現(xiàn)

    安理會(huì)做中介

    聯(lián)合國(guó)機(jī)構(gòu)類--Mediator類

    //聯(lián)合國(guó)機(jī)構(gòu)
    abstract class UnitedNations
    {
        //聲明
        public abstract void Declare(string message, Country colleague);
    }

    國(guó)家類--Colleague類

    //國(guó)家
    abstract class Country
    {
        protected UnitedNations mediator;
        public Country(UnitedNations mediator)
        {
            this.mediator = mediator;
        }
    }

    美國(guó)類--ConcreteColleague類

    //美國(guó)
    class USA : Country
    {
        public USA(UnitedNations mediator) : base(mediator)
        {
        }
        //聲明
        public void Declare(string message)
        {
            mediator.Declare(message, this);
        }
        //獲取消息
        public void GetMessage(string message)
        {
            Console.WriteLine("美國(guó)獲得對(duì)方消息:" + message);
        }
    }

    伊拉克類--ConcreteColleague類

    //伊拉克
    class Iraq : Country
    {
        public Iraq(UnitedNations mediator) : base(mediator)
        {
        }
        //聲明
        public void Declare(string message)
        {
            mediator.Declare(message, this);
        }
        //獲取消息
        public void GetMessage(string message)
        {
            Console.WriteLine("伊拉克獲得對(duì)方消息:" + message);
        }
    }

    聯(lián)合國(guó)安理會(huì)--ConcreteMediator類

    //聯(lián)合國(guó)安全理事會(huì)
    class UnitedNationsSecurity : UnitedNations
    {
        private USA colleague1;
        private Iraq colleague2;
        //美國(guó)
        public USA Colleague1 { set { colleague1 = value; } }
        //伊拉克
        public Iraq Colleague2 { set { colleague2 = value; } }
        public override void Declare(string message, Country colleague)
        {
            if (colleague == colleague1)
            {
                colleague2.GetMessage(message);
            }
            else
            {
                colleague1.GetMessage(message);
            }
        }
    }

    客戶端代碼

    class Program
    {
        //客戶端代碼
        static void Main(string[] args)
        {
            UnitedNationsSecurity UNSC = new UnitedNationsSecurity();
            USA c1 = new USA(UNSC);
            Iraq c2 = new Iraq(UNSC);
            UNSC.Colleague1 = c1;
            UNSC.Colleague2 = c2;
            c1.Declare("不準(zhǔn)研發(fā)核武器,否則開(kāi)戰(zhàn)");
            c2.Declare("沒(méi)研發(fā),開(kāi)戰(zhàn)就開(kāi)戰(zhàn)");
            Console.Read();
        }
    }

    伊拉克獲得對(duì)方消息:不準(zhǔn)研發(fā)核武器,否則開(kāi)戰(zhàn)
    美國(guó)獲得對(duì)方消息:沒(méi)研發(fā),開(kāi)戰(zhàn)就開(kāi)戰(zhàn)

    上述就是小編為大家分享的如何深入理解Java設(shè)計(jì)模式的中介者模式了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI