在很多情況下對象之間的交互是很復雜的,在開始設計的時候,你根本不知道它需要交互的對象是誰,是什么類型。我們知道如果要對象A與對象B之間能相互交互,A與B就會構成相互依賴,如果對象一多,這種依賴就會很復雜,況且很多時候我們都不知道需要互相交互的對象有哪些,因此,在設計的時候也沒辦法考慮這些情況。既然在設計的時候無法預先知道對象之間的交互具體情況,我們可以將這種交互放到一個“中間平臺”進行,這個中間平臺知道所有對象的(依賴于所有對象,但對象是否必須依賴于平臺不是必須的),這樣就將對象之間的依賴簡化成對象與“平臺”之間的依賴,因而會大大降低對象之間的復雜度。當然,對象在平臺能夠進行交互,必須遵守一定的協議,而且這個平臺需要知道所有對象的細節。(這在開發實現時其實算不上什么條件,比如Delphi和C#,Java所有的類都有一個共同的基類,因此不需要額外的為這些交互的對象定義一個抽象的接口之類的)。這種平臺起到的作用就是一種中介的作用。
《設計模式》疑問對中介模式的定義:用一個中介對象來封裝一系列的對象(同事對象)交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
中介模式有三個角色:一個是抽象同事,這個角色的定義純粹是為了使得中介者在定義交互方法的參數時能形式統一,不依賴于具體的同事(一般情況下不需要定義這個抽象類,因為常見的開發語言都有一個基本的類類型(如Delphi,C#的Object類)),二是具體同事類(要交互的對象,可以是已有的,現定義的等),三是中介。下面是中介模式的簡圖:
示例:
public struct Mediator_Param
{
public string Name;
public string Value;
}
/// <summary>
/// Mediator 的摘要說明。
/// </summary>
public abstract class Mediator_Mediator
{
//定義中介者的其它共同屬性
//下面的屬性一般用事件處理,比較好
public abstract void ConcreateColleagueADataChange(Mediator_Colleague sender, Mediator_Param Param);
public abstract void ConcreateColleagueBDataChange(Mediator_Colleague sender, Mediator_Param Param);
}
public class Mediator_ConcreateMediator : Mediator_Mediator
{
private Mediator_ConcreateColleagueA concreateColleagueA;
private Mediator_ConcreateColleagueB concreateColleagueB;
public override void ConcreateColleagueADataChange(Mediator_Colleague sender, Mediator_Param Param)
{
if(Param.Name=="tian")
concreateColleagueB.ShowValue(Param.Value);
}
public override void ConcreateColleagueBDataChange(Mediator_Colleague sender, Mediator_Param Param)
{
concreateColleagueB.ShowValue(Param.Name+" "+Param.Value);
}
public void IntroduceConcreateMediator(Mediator_ConcreateColleagueA concreateColleagueA,Mediator_ConcreateColleagueB concreateColleagueB)
{
this.concreateColleagueA = concreateColleagueA;
this.concreateColleagueB = concreateColleagueB;
}
public Mediator_ConcreateMediator()
{
}
}
public abstract class Mediator_Colleague
{
}
public class Mediator_ConcreateColleagueA : Mediator_Colleague
{
private Mediator_Mediator mediator;
public Mediator_ConcreateColleagueA(Mediator_Mediator mediator)
{
this.mediator = mediator;
}
public void DataChanged()
{
if(mediator!=null)
{
Mediator_Param param;
param.Name = "tian";
param.Value="121212";
mediator.ConcreateColleagueADataChange(this,param);
}
}
}
public class Mediator_ConcreateColleagueB : Mediator_Colleague
{
private Mediator_Mediator mediator;
public Mediator_ConcreateColleagueB(Mediator_Mediator mediator)
{
this.mediator = mediator;
}
public void DataChanged()
{
if(mediator!=null)
{
Mediator_Param param;
param.Name = "zhang";
param.Value="888888";
mediator.ConcreateColleagueBDataChange(this,param);
}
}
public void ShowValue(string Value)
{
System.Windows.Forms.MessageBox.Show(Value);
}
}
public class Mediator_Client
{
public static void Test()
{
Mediator_ConcreateMediator mediator = new Mediator_ConcreateMediator();
Mediator_ConcreateColleagueA mcA= new Mediator_ConcreateColleagueA(mediator);
Mediator_ConcreateColleagueB mcB= new Mediator_ConcreateColleagueB(mediator);
mediator.IntroduceConcreateMediator(mcA,mcB);
mcA.DataChanged();
mcB.DataChanged();
}
}
中介模式的優點:
減少子類生成;將同事類解耦;簡化了對象之間的協議;對對象如何協作進行了抽象;使控制集中化;
中介模式的實現改進:
1)由于一般開發語言都有一個基本父類,因此如果采用這個基本的類作為抽象同事,則在實現時不需要顯示定義。
2)采用事件或者消來進行對象之間的交互,則可以使得同事對象不依賴于中介,進一步解耦中介與對象之間的關系。
典型應用場景:
1)現實生活中的各種交互平臺(比如交易所,超市,集市,購物廣場,交易會,網絡論壇等),特別注意,現實中的很多中介公司(比如留學服務中介等)的中介含義還是與中介模式中的中介含義不太一樣,它們除了體現一種“中介”外,還有“代理”的味道在里面。中介模式中的中介其實僅提供一個交互的平臺,具體的交互還是對象之間來完成的
2)開發系統中的用戶UI界面。
比較:
中介者模式與門面模式雖然有類似的功能,但兩者之間的區別還是很大的,門面模式時為用戶使用一系列的對象提供一個簡化的接口,更多體現的是一種“代理”而不是“中介”;而中介者模式主要是為一系列的對象提供一個交互的場所,中介者對象封裝了一系列對象之間的交互,中介者模式中沒有用戶的角色概念,也不向外提供服務。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
