中介者模式(Mediator)(調停者模式),用一箇中介對象來封裝一系列的對象交互。中介者使各個對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立的改變它們之間的交互。c#
主要解決:對象與對象之間存在大量的關聯關係,這樣勢必會致使系統的結構變得很複雜,同時若一個對象發生改變,咱們也須要跟蹤與之相關聯的對象,同時作出相應的處理。
什麼時候使用:多個類相互耦合,造成了網狀結構。
如何解決:將上述網狀結構分離爲星型結構。安全
例:框架
中介者模式UML結構圖:ide
例:
MVC 框架,其中C(控制器)就是 M(模型)和 V(視圖)的中介者。
窗體的Form對象(每一個控件之間的通訊都是依靠Form對象完成的(經過事件機制進行通訊)(事件機制的執行是在Form對象中完成的),這樣使得每一個控件內部沒必要關注與其餘控件的通訊,下降了耦合度)或者Web界面aspx,以及想定製一個分佈在多個類中的行爲,而又不想生成太多的子類的場合。this
優勢: 一、下降了類的複雜度,將一對多轉化成了一對一。 二、各個類之間的解耦。 三、符合迪米特原則。
缺點:中介者會龐大,變得複雜難以維護。code
外觀(門面)模式與中介者模式的區別:orm
外觀(門面)模式關注的是這組複雜對象如何與外界通訊對象
中介者模式關注的是這組複雜對象之間的內部通訊事件
觀察者模式與中介者模式的聯繫:ci
能夠組合使用,來實現當同事對象發生改變的時候,通知中介者對象,讓中介者對象去進行其餘相關對象的交互。
例(聯合國與和平):
//聯合國機構 abstract class UnitedNations { /// <summary> /// 聲明 /// </summary> /// <param name="message">聲明信息</param> /// <param name="colleague">聲明國家</param> public abstract void Declare(string message, Country colleague); } //聯合國安全理事會 class UnitedNationsSecurityCouncil : 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); } } } //國家 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); } } class Program { static void Main(string[] args) { UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil(); USA c1 = new USA(UNSC); Iraq c2 = new Iraq(UNSC); UNSC.Colleague1 = c1; UNSC.Colleague2 = c2; c1.Declare("不許研製核武器,不然要發動戰爭!"); c2.Declare("咱們沒有核武器,也不怕侵略。"); Console.Read(); } }