中介者模式介紹
中介者模式是一種行為設計模式,能讓你減少物件之間混亂無序的依賴關係,該模式會限制物件之間的直接互動,迫使它們通過一箇中介者物件進行合作。
中介者模式顧名思義,可以用我們平時生活中的房產中介去理解。房產中介就是房子擁有者和想買房子人直接的橋樑,不讓二者直接交易,通過中介去做橋樑,進行溝通和交易。
中介者模式建議你停止元件之間的直接交流並使其相互獨立。這些元件必須呼叫特殊的中介者物件,通過中介者物件重定向呼叫行為,以間接的方式進行合作。最終,元件僅依賴於一箇中介者類,無需與多個元件想耦合。
類所擁有的依賴關係越少,就越易於修改、擴充套件或複用。
可以為所有型別的對話方塊抽取通用介面,進一步消弱其依賴性;介面中將宣告一個所有表單元素都能使用的通知方法,可用於將元素中發生的事件通知給對話方塊,所有實現了該介面的對話方塊都能使用這個提交按鈕。
中介者模式結構
- 1、元件
是包含業務邏輯的類。每一個元件都有一個指向中介者的引用,該引用被宣告為中介者介面型別。元件並不知道中介者所屬的類,這樣就可通過將其連線到不同的中介者使其能在其他程式中複用。
- 2、中介租介面
宣告瞭與元件交流的方法,但通常僅包括一個通知方法。元件可將任意上下文(自身)作為該方法的引數,只有這樣接收元件和傳送者類之間才不會耦合。
- 3、具體中介者
封裝了多種元件間的關係。具體中介者通常會儲存所有元件的引用並對其進行管理,甚至有時會對其生命週期進行管理。
- 4、通知邏輯
元件並不知道其他元件的情況。如果元件內發生了重要事情,它只能通知中介者。中介者收到訊息後能輕易地確定傳送者,者或許已足以去判斷接下來需要觸發的元件。
對於元件來說,中介者其實就是一個黑箱。傳送者不知道最終會由誰來處理自己的請求,接收者也不知道最初的誰發出了請求。
適用場景
- 1 當某些物件和其他物件緊密耦合難以進行修改時
- 2 一個元件過於依賴其他元件而無法在不同應用中複用時
- 3 為了能在不同情景下複用一些基本行為,導致你需要被迫場景大量元件子類時
實現方式
- 找到一組當前緊密耦合的類且提供其獨立效能帶來更大好處的類。
- 宣告中介者介面並描述中介者和各種元件之間所需的交流介面(一個接收元件的方法就夠了)。
- 實現具體中介者類。
- 讓中介者負責元件物件的建立和銷燬。
- 元件必須儲存對於中介物件的引用。
- 修改元件程式碼,使其可呼叫中介者的通知方法,而非其他元件的方法。然後將呼叫其他元件的程式碼抽取到中介者類中,並在中介者接收到該元件通知時執行這些程式碼。
滿足單一職責、開閉原則、減輕應用中多個元件間的耦合情況、方便複用各個元件。
中介者將系統中元件的溝通行為中心化。各元件只知道中介者物件,無法直接相互交流。
中介者的主要目標時消除一系列系統元件之間的相互依賴。這些元件將依賴於同一個中介者物件。
Demo
中介介面和房產鏈家
/// <summary>
/// 房產中介介面
/// </summary>
public interface IHouseMediator
{
void Notify(object sneder,string ev);
}
/// <summary>
/// 鏈家 房產中介。實現房產中介介面
/// </summary>
class LianJiaMediator :IHouseMediator
{
private TianJingHouse _tjHouse;
private XianAnHouse _xaHouse;
public LianJiaMediator(TianJingHouse houseTj, XianAnHouse houseXa)
{
this._tjHouse = houseTj;
this._tjHouse.SetHouseMediator(this);
this._xaHouse = houseXa;
this._xaHouse.SetHouseMediator(this);
}
public void Notify(object sneder, string ev)
{
if (ev == "FirstTJ")
{
Console.WriteLine("輸出......");
this._xaHouse.SecondSell();
}
if (ev == "SecondXA")
{
Console.WriteLine("輸出------");
this._tjHouse.SecondSell();
this._xaHouse.SecondSell();
}
}
}
房子基類和 將售賣的房子
/// <summary>
/// 房子基類
/// </summary>
class BaseHouse
{
protected IHouseMediator _houseMediator;
public BaseHouse(IHouseMediator houseMediator=null)
{
this._houseMediator = houseMediator;
}
public void SetHouseMediator(IHouseMediator houseMediator)
{
this._houseMediator = houseMediator;
}
}
/// <summary>
/// 天津的房子
/// </summary>
class TianJingHouse :BaseHouse
{
public void FirstSell()
{
Console.WriteLine("天津房子第一次出售");
this._houseMediator.Notify(this, "FirstTJ");
}
public void SecondSell()
{
Console.WriteLine("天津房子第二次出售");
this._houseMediator.Notify(this, "SecondTJ");
}
}
/// <summary>
/// 西安的房子
/// </summary>
class XianAnHouse : BaseHouse
{
public void FirstSell()
{
Console.WriteLine("西安房子第一次出售");
this._houseMediator.Notify(this, "FirstXA");
}
public void SecondSell()
{
Console.WriteLine("西安房子第二次出售");
this._houseMediator.Notify(this, "SecondXA");
}
}
class Program
{
static void Main(string[] args)
{
TianJingHouse tjHouse = new TianJingHouse();
XianAnHouse xiHouse = new XianAnHouse();
new LianJiaMediator(tjHouse, xiHouse);
Console.WriteLine("客戶端 執行First TJ");
tjHouse.FirstSell();
Console.ReadLine();
Console.WriteLine("客戶端 執行Second XA");
xiHouse.SecondSell();
Console.ReadKey();
}
}
小寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
原創不易,給個關注。
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩關注、點贊、轉發 謝謝。