中介者模式-Mediator Pattern

設計模式系列

設計模式系列

定義:定義一個 Mediator 物件用來封裝一組物件的互動方式。Mediator 藉由避免物件間相互直接的引用,從而
           降低它們之間的耦合程度,並且可以讓我們獨立地改變這些物件間的互動方式。

日常在系統會遇到比較常見的網狀結構

如果引入中介者模式則會變成,星狀結構。

使用場景

       當物件出現蜘蛛網狀結構。在這種情況下,一定要考慮使用中介者模式。這有利於把蜘蛛網梳理
       為星型結構,使原本複雜混亂的關閉變得清晰簡單。

範例如下:

    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("沒有,你打算請客");

        }
    }

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

    class ConcreteMediator:Mediator
    {
        private ConcreteColleague1 colleague1;
        private ConcreteColleague2 colleague2;

        public ConcreteColleague1 Colleague1
        {
            set { colleague1 = value; }
        }

        public ConcreteColleague2 Colleague2
        {
            set { colleague2 = value; }
        }

        public override void Send(string message, Colleague colleague)
        {
            if (colleague == colleague1)
            {
                colleague2.Notify(message);
            }
            else {
                colleague1.Notify(message);
            }
        }

    }

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

    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}");
        }

    }

優點

       中介者模式的優點就是減少了類間的依賴,把原有的一對多的依賴變成了一對一的依賴,同事
        類只依賴中介者,減少了依賴,當然同時也降低了類間的耦合。

缺點

     中介者模式的缺點就是中介者會膨脹得很大,而且邏輯複雜,原本N個物件直接的相互依賴關係轉
      變為中介者和同事類之間的依賴關係,同事類越多,中介者的邏輯就越複雜。

元哥的筆記