今天我們來講一下中介者模式。 什麼叫中介者模式呢?中介者模式,用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯示的相互引用,從而使其耦合鬆散,而且可以獨立的改變他們之間的交互。 我們拿兩個不認識的同事通過第三人打招呼這個情景,來看一下中介者模式是什麼樣的: 客戶端調用 中介者模式很容易再 ...
今天我們來講一下中介者模式。
什麼叫中介者模式呢?中介者模式,用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯示的相互引用,從而使其耦合鬆散,而且可以獨立的改變他們之間的交互。
我們拿兩個不認識的同事通過第三人打招呼這個情景,來看一下中介者模式是什麼樣的:
1 //抽象中介者類 2 abstract class Mediator 3 { 4 //定義一個抽象的發送消息方法,得到同時對象和發送消息 5 public abstract void Send(string message, Colleague colleague); 6 } 7 abstract class Colleague 8 { 9 protected Mediator mediator; 10 //構造方法,得到中介者對象 11 public Colleague(Mediator mediator) 12 { 13 this.mediator = mediator; 14 } 15 } 16 //具體的中介者類 17 class ConcreteMediator:Mediator 18 { 19 //需要瞭解所有的具體同事類對象 20 private ConcreateColleague1 colleague1; 21 private ConcreateColleague2 colleague2; 22 23 internal ConcreateColleague1 Colleague1 24 { 25 set 26 { 27 colleague1 = value; 28 } 29 } 30 31 internal ConcreateColleague2 Colleague2 32 { 33 set 34 { 35 colleague2 = value; 36 } 37 } 38 //重寫發送信息的方法,根據對象做出選擇判斷,通知對象 39 public override void Send(string message, Colleague colleague) 40 { 41 if (colleague == colleague1) 42 { 43 colleague2.Notify(message); 44 } 45 else 46 { 47 colleague1.Notify(message); 48 } 49 } 50 } 51 //具體的同事類1 52 class ConcreateColleague1:Colleague 53 { 54 public ConcreateColleague1(Mediator mediator) : base(mediator) 55 { 56 } 57 //發送消息時通常使中介者發送出去的。 58 public void Send(string message) 59 { 60 mediator.Send(message, this); 61 } 62 63 public void Notify(string message) 64 { 65 Console.WriteLine($"同事1得到消息{message}"); 66 } 67 } 68 class ConcreateColleague2:Colleague 69 { 70 public ConcreateColleague2(Mediator mediator) : base(mediator) 71 { 72 } 73 74 public void Send(string message) 75 { 76 mediator.Send(message, this); 77 } 78 79 public void Notify(string message) 80 { 81 Console.WriteLine($"同事2得到消息{message}"); 82 } 83 }
客戶端調用
1 public static void Main() 2 { 3 ConcreteMediator m = new ConcreteMediator(); 4 //讓兩個具體同事類認識中介者對象 5 ConcreateColleague1 c1 = new ConcreateColleague1(m); 6 ConcreateColleague2 c2 = new ConcreateColleague2(m); 7 //讓中介者認識各個具體同事類對象 8 m.Colleague1 = c1; 9 m.Colleague2 = c2; 10 //具體同事類對象的發送信息都使通過中介者轉發 11 c1.Send("吃飯了嗎?"); 12 c2.Send("還沒有呢,你打算請客嗎?"); 13 Console.ReadKey(); 14 }
中介者模式很容易再系統中應用,也很容易再系統中誤用。當系統出現‘多對多’交互複雜的對象群時,不要急於使用中介者模式,而要先反思你的系統在設計商是不是合理。
由於把對象如何協同進行了抽象,將中介作為一個獨立的概念並將其封裝在一個對象中,這樣關註的對象就從對象各自本身的行為轉移到他們之間的交互上來,也就是站在一個更巨集觀的角度去看待系統。
中介者模式一般應用於一組對象以定義良好但是複雜的方式進行通信的場合,以及想定製一個分佈在多個類中的行為,而又不想生成太多的子類的場合。
好,中介者模式今天我們就講到這裡,下一篇我們講 享元模式
本系列將持續更新,喜歡的小伙伴可以點一下關註和推薦,謝謝大家的支持