最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.Net行為型設(shè)計(jì)模式之中介者模式(Mediator)

 更新時間:2022年05月26日 10:01:10   作者:springsnow  
這篇文章介紹了.Net行為型設(shè)計(jì)模式之中介者模式(Mediator),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、動機(jī)(Motivate)

為什么要使用中介者模式呢?如果不使用中介者模式的話,各個同事對象將會相互進(jìn)行引用,如果每個對象都與多個對象進(jìn)行交互時,將會形成如下圖所示的網(wǎng)狀結(jié)構(gòu)。

從上圖可以發(fā)現(xiàn),如果不使用中介者模式的話,每個對象之間過度耦合,這樣的既不利于類的復(fù)用也不利于擴(kuò)展。如果引入了中介者模式,那么對象之間的關(guān)系將變成星型結(jié)構(gòu),采用中介者模式之后會形成如下圖所示的結(jié)構(gòu):

從上圖可以發(fā)現(xiàn),使用中介者模式之后,任何一個類的變化,只會影響中介者和類本身,不像之前的設(shè)計(jì),任何一個類的變化都會引起其關(guān)聯(lián)所有類的變化。這樣的設(shè)計(jì)大大減少了系統(tǒng)的耦合度。

在軟件構(gòu)建過程中,經(jīng)常會出現(xiàn)多個對象互相關(guān)聯(lián)交互的情況,對象之間常常會維持一種復(fù)雜的引用關(guān)系,如果遇到一些需求的更改,這種直接的引用關(guān)系將面臨不斷地變化。
在這種情況下,我們可使用一個“中介對象”來管理對象間的關(guān)聯(lián)關(guān)系,避免相互交互的對象之間的緊耦合引用關(guān)系,從而更好地抵御變化。

二、意圖(Intent)

定義了一個中介對象來封裝一系列對象之間的交互關(guān)系。中介者使各個對象之間不需要顯式地相互引用,從而使耦合性降低,而且可以獨(dú)立地改變它們之間的交互行為。                                 ——《設(shè)計(jì)模式》GoF

三、結(jié)構(gòu)圖(Structure)

四、模式的組成

可以看出,在中介者模式的結(jié)構(gòu)圖有以下角色:
(1)、抽象中介者角色(Mediator):在里面定義各個同事之間交互需要的方法,可以是公共的通信方法,也可以是小范圍的交互方法。
(2)、具體中介者角色(ConcreteMediator):它需要了解并維護(hù)各個同事對象,并負(fù)責(zé)具體的協(xié)調(diào)各同事對象的交互關(guān)系。
(3)、抽象同事類(Colleague):通常為抽象類,主要約束同事對象的類型,并實(shí)現(xiàn)一些具體同事類之間的公共功能,比如,每個具體同事類都應(yīng)該知道中介者對象,也就是具體同事類都會持有中介者對象,都可以到這個類里面。
(4)、具體同事類(ConcreteColleague):實(shí)現(xiàn)自己的業(yè)務(wù),需要與其他同事通信時候,就與持有的中介者通信,中介者會負(fù)責(zé)與其他同事類交互。

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

中介者模式在現(xiàn)實(shí)生活中也有類似的例子,不論是QQ群或者是微信群,或者手提電話,它們都是充當(dāng)一個中間平臺,QQ用戶可以登錄這個中間平臺與其他QQ用戶進(jìn)行交流,如果沒有這些中間平臺,我們?nèi)绻肱c朋友進(jìn)行聊天的話,可能就需要當(dāng)面才可以了。比如:在公司管理過程中,就會涉及到各個部門之間的協(xié)調(diào)和合作,如何各個部門直接來溝通,看著好像直接高效,其實(shí)不然。各個部門之間為了完成一個工作,溝通協(xié)調(diào)就需要一個人來做這個工作,誰呢?總經(jīng)理,我們這里就把總經(jīng)理定義為成總的管理者,各個部門需要向他匯報和發(fā)起工作請求。

static void Main(String[] args)
{
    President mediator = new President();
    Market market = new Market(mediator);
    Development development = new Development(mediator);
    Financial financial = new Financial(mediator);

    mediator.SetFinancial(financial);
    mediator.SetDevelopment(development);
    mediator.SetMarket(market);

    market.Process();
    market.Apply();

}

//抽象中介者角色
public interface Mediator
{
    void Command(Department department);
}

//總經(jīng)理--相當(dāng)于具體中介者角色
public sealed class President : Mediator
{
    //總經(jīng)理有各個部門的管理權(quán)限
    private Financial _financial;
    private Market _market;
    private Development _development;

    public void SetFinancial(Financial financial)
    {
        this._financial = financial;
    }
    public void SetDevelopment(Development development)
    {
        this._development = development;
    }
    public void SetMarket(Market market)
    {
        this._market = market;
    }

    public void Command(Department department)
    {
        if (department.GetType() == typeof(Market))
        {
            _financial.Process();
        }
    }
}

//同事類的接口
public abstract class Department
{
    //持有中介者(總經(jīng)理)的引用
    private Mediator mediator;

    protected Department(Mediator mediator)
    {
        this.mediator = mediator;
    }

    public Mediator GetMediator
    {
        get { return mediator; }
        private set { this.mediator = value; }
    }

    //做本部門的事情
    public abstract void Process();

    //向總經(jīng)理發(fā)出申請
    public abstract void Apply();
}

//開發(fā)部門
public sealed class Development : Department
{
    public Development(Mediator m) : base(m) { }

    public override void Process()
    {
        Console.WriteLine("我們是開發(fā)部門,要進(jìn)行項(xiàng)目開發(fā),沒錢了,需要資金支持!");
    }

    public override void Apply()
    {
        Console.WriteLine("專心科研,開發(fā)項(xiàng)目!");
    }
}

//財(cái)務(wù)部門
public sealed class Financial : Department
{
    public Financial(Mediator m) : base(m) { }

    public override void Process()
    {
        Console.WriteLine("匯報工作!沒錢了,錢太多了!怎么花?");
    }

    public override void Apply()
    {
        Console.WriteLine("數(shù)錢!");
    }
}

//市場部門
public sealed class Market : Department
{
    public Market(Mediator mediator) : base(mediator) { }

    public override void Process()
    {
        Console.WriteLine("匯報工作!項(xiàng)目承接的進(jìn)度,需要資金支持!");
        GetMediator.Command(this);
    }

    public override void Apply()
    {
        Console.WriteLine("跑去接項(xiàng)目!");
    }
}

六、中介者模式的實(shí)現(xiàn)要點(diǎn):

將多個對象間復(fù)雜的關(guān)聯(lián)關(guān)系解耦,Mediator模式將多個對象間的控制邏輯進(jìn)行集中管理,變“多個對象互相關(guān)聯(lián)”為“多個對象和一個中介者關(guān)聯(lián)”,簡化了系統(tǒng)的維護(hù),抵御了可能的變化。隨著控制邏輯的復(fù)雜化,Mediator具體對象的實(shí)現(xiàn)可能相當(dāng)復(fù)雜。這時候可以對Mediator對象進(jìn)行分解處理。

  • Facade模式是解耦系統(tǒng)外到系統(tǒng)內(nèi)(單向)的對相關(guān)聯(lián)關(guān)系
  • Mediator模式是解耦系統(tǒng)內(nèi)各個對象之間(雙向)的關(guān)聯(lián)關(guān)系

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

(1)、松散耦合:中介者模式通過把多個同事對象之間的交互封裝到中介對象里面,從而使得對象之間松散耦合,基本上可以做到互不依賴。這樣一來,同時對象就可以獨(dú)立的變化和復(fù)用,不再“牽一發(fā)動全身”
(2)、集中控制交互:多個同事對象的交互,被封裝在中介者對象里面集中管理,使得這些交互行為發(fā)生變化的時候,只需要修改中介者就可以了。
(3)、多對多變?yōu)橐粚Χ?/strong>:沒有中介者模式的時候,同事對象之間的關(guān)系通常是多對多,引入中介者對象后,中介者和同事對象的關(guān)系通常變?yōu)殡p向的一對多,這會讓對象的關(guān)系更容易理解和實(shí)現(xiàn)。

2、中介者模式的缺點(diǎn)

過多集中化:如果同事對象之間的交互非常多,而且比較復(fù)雜,當(dāng)這些復(fù)雜性全都集中到中介者的時候,會導(dǎo)致中介者對象變的十分復(fù)雜,而且難于維護(hù)和管理。

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

根據(jù)我個人的理解,微軟的ASP.NET MVC開發(fā)模式就是一個中介者模式的很好的實(shí)現(xiàn),其中C就是Controller,也就是中文所說的控制器,控制器就是一個中介者,M和V和它打交道,具體的情況大家可以去查看相關(guān)資料,這方面的資料還是很多的。

到此這篇關(guān)于.Net行為型設(shè)計(jì)模式之中介者模式(Mediator)的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

黑龙江省| 塘沽区| 衡阳县| 乌拉特后旗| 吉首市| 江西省| 沛县| 克拉玛依市| 宜川县| 喀什市| 宁武县| 岳池县| 丹棱县| 虹口区| 贵溪市| 郯城县| 渝中区| 东丽区| 黑龙江省| 马关县| 克拉玛依市| 沈丘县| 常德市| 道孚县| 泾阳县| 江北区| 棋牌| 萝北县| 延吉市| 清原| 金平| 乌兰县| 横峰县| 苏尼特左旗| 黑河市| 阿拉尔市| 桦南县| 神农架林区| 岱山县| 哈密市| 金华市|