中介者模式(Mediator Pattern)是一種行為型設計模式,其核心思想是將多個對象之間的交互集中到一個中介者對象中,從而減少對象之間的直接交互,降低耦合度。在實現復雜系統時,中介者模式有助于提高系統的可維護性和擴展性。
在本文中,我們將通過一個簡單的示例來詳細講解如何在C#中實現中介者模式。
1. 中介者模式的概述
中介者模式的核心是引入一個中介者對象,來協調多個同事對象之間的交互。這樣,所有對象的交互都不再是直接的,而是通過中介者來完成。這樣可以減少對象之間的依賴關系,使得系統更易于維護和擴展。
中介者模式的主要角色
-
Mediator(中介者接口):定義了中介者對象與同事對象的交互接口,聲明了用于與同事對象通信的方法。
-
ConcreteMediator(具體中介者):實現中介者接口,負責協調具體的同事對象之間的交互邏輯。
-
Colleague(同事對象接口):每個同事對象都持有對中介者對象的引用,通過中介者與其他同事對象交互。
-
ConcreteColleague(具體同事類):實現同事接口,執行具體的業務邏輯,并通過中介者與其他同事類交互。
中介者模式的優缺點
優點:
-
減少耦合:同事對象不再直接通信,而是通過中介者來協調,降低了各對象之間的依賴關系。
-
集中控制:所有交互邏輯集中在中介者中,便于修改和擴展。
-
靈活性高:修改交互邏輯時,只需調整中介者的實現,不需要改變同事類的實現。
缺點:
-
中介者復雜:隨著系統中同事對象的增多,中介者的實現可能變得復雜,難以維護。
-
單一職責原則被違反:中介者承擔了過多的協調責任,可能會違反單一職責原則,導致中介者的代碼變得臃腫。
2. 中介者模式在C#中的實現
接下來,我們通過一個實際的代碼示例來展示如何在C#中實現中介者模式。
步驟 1:定義中介者接口
首先,我們定義一個IMediator
接口,它聲明了一個Send
方法,用于發送消息。該方法的參數包括消息內容和發送該消息的同事對象。
public interface IMediator
{void Send(string message, Colleague colleague);
}
步驟 2:實現具體的中介者類
接下來,我們實現一個具體的中介者類ConcreteMediator
,它負責協調ColleagueA
和ColleagueB
之間的通信。具體的中介者類持有兩個同事對象,并根據需要將消息從一個同事傳遞給另一個同事。
public class ConcreteMediator : IMediator
{private ColleagueA colleagueA;private ColleagueB colleagueB;public ConcreteMediator(ColleagueA colleagueA, ColleagueB colleagueB){this.colleagueA = colleagueA;this.colleagueA.SetMediator(this);this.colleagueB = colleagueB;this.colleagueB.SetMediator(this);}public void Send(string message, Colleague colleague){if (colleague == colleagueA){colleagueB.Notify(message); // 如果消息來自 ColleagueA,則通知 ColleagueB}else{colleagueA.Notify(message); // 如果消息來自 ColleagueB,則通知 ColleagueA}}
}
步驟 3:定義同事類的抽象
我們定義一個抽象的Colleague
類,表示所有同事對象。每個同事對象都持有對中介者的引用,并通過中介者與其他同事對象交互。
public abstract class Colleague
{protected IMediator mediator;public void SetMediator(IMediator mediator){this.mediator = mediator;}public abstract void Notify(string message); // 接受來自其他同事的消息
}
步驟 4:實現具體的同事類
我們實現兩個具體的同事類ColleagueA
和ColleagueB
,它們繼承自Colleague
并實現Notify
方法。當同事對象接收到消息時,會通過Notify
方法處理消息。
public class ColleagueA : Colleague
{public override void Notify(string message){Console.WriteLine("ColleagueA gets message: " + message);}
}public class ColleagueB : Colleague
{public override void Notify(string message){Console.WriteLine("ColleagueB gets message: " + message);}
}
步驟 5:客戶端代碼
在客戶端代碼中,我們實例化同事對象和中介者對象,并模擬消息的傳遞。ColleagueA
和ColleagueB
之間的交互完全通過中介者ConcreteMediator
來協調。
class Program
{static void Main(string[] args){// 創建同事對象ColleagueA colleagueA = new ColleagueA();ColleagueB colleagueB = new ColleagueB();// 創建中介者對象并傳入同事對象ConcreteMediator mediator = new ConcreteMediator(colleagueA, colleagueB);// 同事A發送消息colleagueA.Notify("Hello from A");// 同事B發送消息colleagueB.Notify("Hello from B");}
}
運行結果
ColleagueB gets message: Hello from A
ColleagueA gets message: Hello from B
解釋:
-
ConcreteMediator
類:ConcreteMediator
類負責協調ColleagueA
和ColleagueB
之間的通信。當其中一個同事發送消息時,ConcreteMediator
會將消息轉發給另一個同事。通過這種方式,同事對象之間不再直接依賴于彼此。 -
ColleagueA
和ColleagueB
類:這兩個類實現了Colleague
接口,并通過Notify
方法接收消息。每個同事對象都通過中介者與其他對象進行通信。
3. 中介者模式的優點和應用場景
優點:
-
減少了對象間的依賴關系:同事對象不再直接依賴于其他對象,而是通過中介者進行通信,從而降低了系統的耦合度。
-
集中控制:所有的交互邏輯都由中介者控制,修改或擴展交互行為變得更加容易。
-
更好的維護性和擴展性:如果要添加新的同事對象,只需更新中介者即可,原有的同事對象不需要改動。
應用場景:
-
GUI組件:在圖形用戶界面(GUI)中,按鈕、文本框、標簽等控件常常需要相互配合工作。通過中介者模式,可以將控件之間的交互集中在一個中介者中進行協調。
-
聊天系統:在一個聊天室中,用戶之間的消息傳遞通常通過服務器進行調度,服務器充當中介者來協調各個用戶之間的消息。
-
航空系統:航空公司、飛機和機場之間的協調也可以通過一個航空控制中心(中介者)來實現。
4. 總結
中介者模式是一種通過引入中介者來減少對象間直接通信的設計模式。它將多個同事對象的交互集中到一個中介者對象中,從而降低了系統的耦合度。在C#中實現中介者模式時,關鍵是設計一個清晰的中介者接口和具體的中介者類來管理同事對象的交互。中介者模式非常適用于需要減少對象之間緊密耦合的場景,但在同事對象較多時,中介者可能會變得過于復雜,因此需要合理使用。