在很多情況下對象之間的互動是很複雜的,在開始設計的時候,你根本不知道它需要互動的對象是誰,是什麼類型。我們知道如果要對象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
public Mediator_ConcreateColleagueB(Mediator_Mediator mediator)
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)現實生活中的各種互動平台(比如交易所,超市,集市,購物廣場,交易會,網絡論壇等),特别注意,現實中的很多中介公司(比如留學服務中介等)的中介含義還是與中介模式中的中介含義不太一樣,它們除了展現一種“中介”外,還有“代理”的味道在裡面。中介模式中的中介其實僅提供一個互動的平台,具體的互動還是對象之間來完成的