Gof定義
用一箇中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式的相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。
動機
在軟件構建過程中,經常會出現多個對象互相關聯交互的情況,對象之間常常會維持一種複雜的引用關係,如果遇到一些需求的更改,這種直接的引用關係將面臨不斷的變化。在這種情況下,我們可使用一個“中介對象”來管理對象間的關聯關係,避免相互交互的對象之間的緊耦合引用關係,從而更好地抵禦變化。
中介者模式的結構圖:
代碼實現:
/// <summary> /// 抽象的中介者 /// </summary> public abstract class Mediator { public abstract void Send(string msg, Colleague colleague); } /// <summary> /// 抽象的同事類 /// </summary> public abstract class Colleague { protected Mediator _mediator; public Colleague(Mediator mediator) { _mediator = mediator; } } /// <summary> /// 具體的中介者對象 /// </summary> public class ConcreteMediator : Mediator { public ConcreteCollegue1 Colleague1 { get; set; } public ConcreteCollegue2 Colleague2 { get; set; } public override void Send(string msg, Colleague colleague) { if (colleague == Colleague1) { Colleague2.Notify(msg); } else { Colleague1.Notify(msg); } } } /// <summary> /// 具體的同事類1 /// </summary> public class ConcreteCollegue1:Colleague { public ConcreteCollegue1(Mediator mediator) : base(mediator) { } public void Send(string msg) { _mediator.Send(msg,this); } public void Notify(string msg) { Console.WriteLine("通知同事1:"+msg); } } /// <summary> /// 具體的同事類2 /// </summary> public class ConcreteCollegue2:Colleague { public ConcreteCollegue2(Mediator mediator) : base(mediator) { } public void Send(string msg) { _mediator.Send(msg,this); } public void Notify(string msg) { Console.WriteLine("通知同事2:"+msg); } } /// <summary> /// 客戶端調用 /// </summary> class Program { static void Main(string[] args) { ConcreteMediator cm = new ConcreteMediator(); ConcreteCollegue1 cc1 = new ConcreteCollegue1(cm); ConcreteCollegue2 cc2 = new ConcreteCollegue2(cm); cm.Colleague1 = cc1; cm.Colleague2 = cc2; cc1.Send("看阿凡達了嗎?"); cc2.Send("呵呵,週末公司組織去看。"); } }
Mediator模式的幾個要點
將多個對象間複雜的關聯關係解耦,Mediator模式將多個對象間的控制邏輯進行集中管理,變“多個對象互相關聯”爲“多個對象和一箇中介者關聯”,簡化了系統的維護,抵禦了可能的變化。
隨着控制邏輯的複雜化,Mediator具體對象的實現可能相當複雜。這時候可以對Mediator對象進行分解處理。
Façade模式是解耦系統外到系統內(單向)的對象關聯關係;Mediator模式是解耦系統內各個對象之間(雙向)的關聯關係。