今天,我們來學習下中介者模式,所謂中介者模式,就是充當一箇中間人的角色,讓兩種不同領域的人溝通;把這句話轉換為軟體角色就是讓有交集的兩個類變得沒有任何關係。沒有關係就表明了兩個類之間的耦合度為零,這就是我們需要的最終奧義,也是中介者模式要達到的目的。
首先第一步,抽象一箇中介者,這個中介者就幹一件事,傳遞資訊,所以,程式碼如下
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類中有兩個屬性和一個方法,根據我們生活的常識來說,一個具體的中介者,是不是需要認識雙發需要交流的人,所以這裡我們也需要獲取ConcreteColleague1和ConcreteColleague2,然後重寫父類Mediator的Send方法,到這裡我們的中介者模式所以骨架就都完成了,接下來,讓我們來看看如何使用它。
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),然後他們都會各自去找我們的中介者(把自身物件傳遞給中介者),最後,他們就可以傳送訊息通訊了,我們看執行結果
本來兩個不相干的類,通過中介者模式可以實現互動,這是多麼的神奇啊是吧。
官方說明中介者模式概述:可以把系統的網狀結構變成以中介者為中心的星型結構。這樣轉變的好處就是保證了物件結構上的穩定,系統的結構不會因為引入新物件而帶來大量的修改工作。