設計模式----中介模式

守望陽光01發表於2019-04-14

        今天,我們來學習下中介者模式,所謂中介者模式,就是充當一箇中間人的角色,讓兩種不同領域的人溝通;把這句話轉換為軟體角色就是讓有交集的兩個類變得沒有任何關係。沒有關係就表明了兩個類之間的耦合度為零,這就是我們需要的最終奧義,也是中介者模式要達到的目的。

       首先第一步,抽象一箇中介者,這個中介者就幹一件事,傳遞資訊,所以,程式碼如下

abstract class Mediator
    {
        
        public abstract void Send(string message, Colleague colleague);

    }

        Mediator類就是我們抽象的一箇中介者類,它有一個Send方法,方法引數有兩個,一個message和一個Colleague,我們想一下,一箇中介者是如何傳遞訊息的,首先,它得到一個需要傳遞訊息的人,然後把這個人的訊息傳遞給更多的人,所以,這裡的Colleague型別就是我們抽象出來的人的類

abstract class Colleague
    {
        protected Mediator mediator;
        public Colleague(Mediator mediator)
        {
            this.mediator = mediator;
        }
    }

       上面就是我們抽象的Colleague類,人當然需要中介者才能完成它想要完成的任務,所以,這裡就是通過建構函式注入的方式獲取一箇中介者。好了,所有的抽象都已完成,接下來我們就來實現他們吧

       首先,我們先實現兩個同事類吧

class ConcreteColleague1 : Colleague
    {
        public ConcreteColleague1(Mediator mediator) : base(mediator)
        { }
        public void Send(string message)
        {
            mediator.Send(message, this);
        }
        public void Notify(string message)
        {
            Console.WriteLine("同事1得到的資訊:" + message);
        }
    }





class ConcreteColleague2 : Colleague
    {
        public ConcreteColleague2(Mediator mediator) : base(mediator)
        {

        }
        public void Send(string message)
        {
            mediator.Send(message, this);
        }
        public void Notify(string message)
        {
            Console.WriteLine("同事2得到的資訊:" + message);
        }
    }

       ConcreteColleague1類和ConcreteColleague2類就是我們實現的同事類,他們都繼承Colleague類,到了這裡可能會有點蒙,我們來梳理一下,首先是Send方法,這裡是在做什麼事呢?我們看到它的內部是呼叫了Send方法,這個Send方法就是我們抽象的中介者的Send方法,然後把訊息和自身傳遞給中介者,供中介者使用,然後Notify方法就是輸入自身的互動資訊。接下來,我們要實現中介者抽象了,我們需要一個具體的中介者來幫忙做事。

 class ConcreteMediator : Mediator
    {
        private ConcreteColleague1 concrete1;
        private ConcreteColleague2 concrete2;

        public ConcreteColleague1 Colleague1
        {
            set { concrete1 = value; }
        }
        public ConcreteColleague2 Colleague2
        {
            set { concrete2 = value; }
        }
        public override void Send(string message, Colleague colleague)
        {
            if (colleague == concrete2) concrete2.Notify(message);
            else concrete1.Notify(message);


        }
    }

        我們可以看到,ConcreteMediator類中有兩個屬性和一個方法,根據我們生活的常識來說,一個具體的中介者,是不是需要認識雙發需要交流的人,所以這裡我們也需要獲取ConcreteColleague1ConcreteColleague2,然後重寫父類MediatorSend方法,到這裡我們的中介者模式所以骨架就都完成了,接下來,讓我們來看看如何使用它。

class Program
    {
        static void Main(string[] args)
        {
            ConcreteMediator m = new ConcreteMediator();

            ConcreteColleague1 c1 = new ConcreteColleague1(m);
            ConcreteColleague2 c2 = new ConcreteColleague2(m);

            m.Colleague1 = c1;
            m.Colleague2 = c2;

            c1.Send("吃過飯了嗎?");
            c2.Send("沒有呢,你打算請客?");

            Console.Read();
        }
    }

        首先,第一步,我們先new一箇中介者出來,然後再new兩位同事出來,我們new出來的這兩位同事肯定是要和中介者認識啊(所以new需要一箇中介者物件m),然後他們都會各自去找我們的中介者(把自身物件傳遞給中介者),最後,他們就可以傳送訊息通訊了,我們看執行結果

        本來兩個不相干的類,通過中介者模式可以實現互動,這是多麼的神奇啊是吧。

        官方說明中介者模式概述:可以把系統的網狀結構變成以中介者為中心的星型結構。這樣轉變的好處就是保證了物件結構上的穩定,系統的結構不會因為引入新物件而帶來大量的修改工作。

相關文章