C#設計模式之中介者模式

提高班14期郭倩_Ulrica發表於2018-06-08

前言

中介者模式是一個很好理解的模式,我們身邊最形象的例子就是房介。

中介者模式

英文:Mediator

用一箇中介物件來封裝一系列的物件互動。中介者使各個物件不需要顯式的相互引用,從而使其耦合鬆散,而且可以獨立的改變它們之間的互動。

場景

現在最火熱的話題,租房。
我們現在一般找房源都會通過中介,可以說是一個簡捷的橋樑。我們和房主之間可能不會直接談合同,而是由中介在中間做一些工作,以達到使雙方都滿意的效果。這樣也避免了我們和房主之間的一些不愉快,雖然在中介這裡可能會有一些費用(時間),但是也省去了雙方都跑腿和周旋了。
這裡寫圖片描述
這裡寫圖片描述

優缺點

中介者模式很容易在系統中應用,也很容易在系統中誤用。當系統出現“多對多”互動複雜的物件群時,不要急於使用中介者模式,而是先要反思系統在設計上是否合理。
優點:
減少了耦合,可以獨立改變和複用類。
缺點:
具體中介者類因為物件的越來越多,變得太複雜,不容易維護。

應用

一般應用於一組物件以定義良好但是複雜的方式進行通訊的場合,以及想制定一個分佈在多個類中的行為,而又不想生成太多的子類的場合。

程式碼展示

抽象中介者類:

//聯合國機構類

    abstract class UniteNations
    {
        //宣告
        public abstract void Declare(string message, Country colleague);
    }

抽象同事類:

//國家類-----抽象
    abstract class Country
    {
        protected UniteNations mediator;

        public Country(UniteNations mediator)
        {
            this.mediator = mediator;
        }
    }

具體中介者類:

//聯合國類----具體中介者
    class UnitedNationSecurityCouncil:UniteNations 
    {
        private USA colleague1;
        private Iraq colleague2;

        //美國
        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 USA:Country 
    {
        public USA(UniteNations mediator)
            : base(mediator)
        { }

        //宣告
        public void Declare(string message)
        {
            mediator.Declare(message, this);
        }

        //獲得訊息
        public void GetMessage(string message)
        {
            Console.WriteLine("美國獲得對方資訊:"+message );
        }
    }




    //伊拉克---具體---同美國↑
    class Iraq:Country 
    {
        public Iraq(UniteNations mediator)
            : base(mediator)
        { }

        //宣告
        public void Declare(string message)
        {
            mediator.Declare(message, this);
        }

        //獲得訊息
        public void GetMessage(string message)
        {
            Console.WriteLine("伊拉克獲得對方資訊:"+message);
        }
    }

客戶端程式碼

class Program
    {
        static void Main(string[] args)
        {
            UnitedNationSecurityCouncil UNSC = new UnitedNationSecurityCouncil();

            USA c1 = new USA(UNSC);
            Iraq c2 = new Iraq(UNSC);

            UNSC.Colleague1 = c1;
            UNSC.Colleague2 = c2;

            c1.Declare("不準研製核武器,否則要發動戰爭!");
            c2.Declare("我們滅有核武器,也不怕侵略。");

            Console.Read();
        }
    }

效果圖:

中介

後記


也祝願在聯合國這個中介者的協調下,世界不再有戰爭,永遠和平充滿愛!

相關文章