中介者模式(Mediator),用一箇中介對象來封裝一系列的對象交互。中介者使各對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立地改變他們之間的交互。javascript
來看中介者模式的結構圖:html
Colleague叫作抽象同事類,而ConcreteColleague是具體同事類,每一個具體同事只知道本身的行爲,而不瞭解其餘同時類的狀況,但它們卻都認識中介者對象,Mediator是抽象中介者,定義了同事對象到中介者對象的接口,ConcreteMediator是具體中介者對象,實現抽象類方法,它須要知道全部具體同事類,並從具體同事接收信息,向具體同事對象發出命令。java
下面給出中介者模式的基本代碼結構:git
namespace ConsoleApplication1 { //Mediator 抽象中介者類 abstract class Mediator { public abstract void Send(string message, Colleague colleague); } //Colleague類 抽象同事類 abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; } } //ConcreteMediator類 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); } } } 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); } } 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.ReadKey(); } } }
結果以下所示:設計模式
中介者模式很容易在系統中應用,也很容易在系統中誤用。當系統出現了「多對多」交互複雜的對象羣時,不要急於使用中介者模式,而要反思你的系統在設計上是否是合理。ide
中介者模式的有點首先是Mediator的出現減小了各個Colleague的耦合,使得能夠獨立地改變和複用各個Colleague類和Mediator。其次,因爲把對象如何協做進行了抽象,將中介做爲一個獨立的概念並將其封裝在一個對象中,這樣關注的對象就從對象各自自己的行爲轉移到它們之間的交互上來,也就是站在一個更宏觀的角度去看待系統。post
因爲ConcreteMediator控制了集中化,因而就把交互複雜性變爲了中介者的複雜性,這就使得中介者會變得比任何一個ConcreteColleague都複雜。中介者模式通常用於一組對象以定義良好可是複雜的方式進行通訊的場合,以及想定製一個分佈在多個類中的行爲,而又不想生成太多的子類的場合。學習
下面回到《大話設計莫》裏面關於聯合國的例子:this
namespace ConsoleApplication1 { //聯合國機構 abstract class UnitedNations { //聲明 public abstract void Declare(string message, Country colleague); } //國家類 abstract class Country { protected UnitedNations mediator; public Country(UnitedNations mediator) { this.mediator = mediator; } } //美國類 class USA : Country { public USA(UnitedNations 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(UnitedNations mediator) : base(mediator) { } //聲明 public void Declare(string message) { mediator.Declare(message, this); } //得到信息 public void GetMessage(string message) { Console.WriteLine("伊拉克得到對方信息:" + message); } } //聯合國安理會,至關於ConcreteMediator類 class UnitedNationsSecurityCounci1 : UnitedNations { 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 Program { static void Main(string[] args) { UnitedNationsSecurityCounci1 UNSC = new UnitedNationsSecurityCounci1(); USA c1 = new USA(UNSC); Iraq c2 = new Iraq(UNSC); UNSC.Colleague1 = c1; UNSC.Colleague2 = c2; c1.Declare("不許研發核武器,不然要發動戰爭!"); c2.Declare("咱們沒有核武器,也不怕侵略。"); Console.ReadKey(); } } }
結果以下所示:spa