亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

設(shè)計(jì)模式之--中介者模式

系統(tǒng) 1528 0

在很多情況下對(duì)象之間的交互是很復(fù)雜的,在開(kāi)始設(shè)計(jì)的時(shí)候,你根本不知道它需要交互的對(duì)象是誰(shuí),是什么類(lèi)型。我們知道如果要對(duì)象A與對(duì)象B之間能相互交互,A與B就會(huì)構(gòu)成相互依賴(lài),如果對(duì)象一多,這種依賴(lài)就會(huì)很復(fù)雜,況且很多時(shí)候我們都不知道需要互相交互的對(duì)象有哪些,因此,在設(shè)計(jì)的時(shí)候也沒(méi)辦法考慮這些情況。既然在設(shè)計(jì)的時(shí)候無(wú)法預(yù)先知道對(duì)象之間的交互具體情況,我們可以將這種交互放到一個(gè)“中間平臺(tái)”進(jìn)行,這個(gè)中間平臺(tái)知道所有對(duì)象的(依賴(lài)于所有對(duì)象,但對(duì)象是否必須依賴(lài)于平臺(tái)不是必須的),這樣就將對(duì)象之間的依賴(lài)簡(jiǎn)化成對(duì)象與“平臺(tái)”之間的依賴(lài),因而會(huì)大大降低對(duì)象之間的復(fù)雜度。當(dāng)然,對(duì)象在平臺(tái)能夠進(jìn)行交互,必須遵守一定的協(xié)議,而且這個(gè)平臺(tái)需要知道所有對(duì)象的細(xì)節(jié)。(這在開(kāi)發(fā)實(shí)現(xiàn)時(shí)其實(shí)算不上什么條件,比如Delphi和C#,Java所有的類(lèi)都有一個(gè)共同的基類(lèi),因此不需要額外的為這些交互的對(duì)象定義一個(gè)抽象的接口之類(lèi)的)。這種平臺(tái)起到的作用就是一種中介的作用。

《設(shè)計(jì)模式》疑問(wèn)對(duì)中介模式的定義:用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象(同事對(duì)象)交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。

中介模式有三個(gè)角色:一個(gè)是抽象同事,這個(gè)角色的定義純粹是為了使得中介者在定義交互方法的參數(shù)時(shí)能形式統(tǒng)一,不依賴(lài)于具體的同事(一般情況下不需要定義這個(gè)抽象類(lèi),因?yàn)槌R?jiàn)的開(kāi)發(fā)語(yǔ)言都有一個(gè)基本的類(lèi)類(lèi)型(如Delphi,C#的Object類(lèi))),二是具體同事類(lèi)(要交互的對(duì)象,可以是已有的,現(xiàn)定義的等),三是中介。下面是中介模式的簡(jiǎn)圖:

設(shè)計(jì)模式之--中介者模式

示例:

public struct Mediator_Param
{
public string Name;
public string Value;
}
/// <summary>
/// Mediator 的摘要說(shuō)明。
/// </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();
}
}

中介模式的優(yōu)點(diǎn):

減少子類(lèi)生成;將同事類(lèi)解耦;簡(jiǎn)化了對(duì)象之間的協(xié)議;對(duì)對(duì)象如何協(xié)作進(jìn)行了抽象;使控制集中化;

中介模式的實(shí)現(xiàn)改進(jìn):

1)由于一般開(kāi)發(fā)語(yǔ)言都有一個(gè)基本父類(lèi),因此如果采用這個(gè)基本的類(lèi)作為抽象同事,則在實(shí)現(xiàn)時(shí)不需要顯示定義。

2)采用事件或者消來(lái)進(jìn)行對(duì)象之間的交互,則可以使得同事對(duì)象不依賴(lài)于中介,進(jìn)一步解耦中介與對(duì)象之間的關(guān)系。

典型應(yīng)用場(chǎng)景:

1)現(xiàn)實(shí)生活中的各種交互平臺(tái)(比如交易所,超市,集市,購(gòu)物廣場(chǎng),交易會(huì),網(wǎng)絡(luò)論壇等),特別注意,現(xiàn)實(shí)中的很多中介公司(比如留學(xué)服務(wù)中介等)的中介含義還是與中介模式中的中介含義不太一樣,它們除了體現(xiàn)一種“中介”外,還有“代理”的味道在里面。中介模式中的中介其實(shí)僅提供一個(gè)交互的平臺(tái),具體的交互還是對(duì)象之間來(lái)完成的

2)開(kāi)發(fā)系統(tǒng)中的用戶(hù)UI界面。

比較:

中介者模式與門(mén)面模式雖然有類(lèi)似的功能,但兩者之間的區(qū)別還是很大的,門(mén)面模式時(shí)為用戶(hù)使用一系列的對(duì)象提供一個(gè)簡(jiǎn)化的接口,更多體現(xiàn)的是一種“代理”而不是“中介”;而中介者模式主要是為一系列的對(duì)象提供一個(gè)交互的場(chǎng)所,中介者對(duì)象封裝了一系列對(duì)象之間的交互,中介者模式中沒(méi)有用戶(hù)的角色概念,也不向外提供服務(wù)。

設(shè)計(jì)模式之--中介者模式


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 亚洲乱码一区二区三区国产精品 | 国产精品亚洲午夜不卡 | 可以看美女隐私的网站 | 四虎影永久在线高清免费 | 伊人伊色 | 伊人久久在线 | 欧美日韩无线码在线观看 | 一级床上爽高清播放 | 欧美日韩亚洲区久久综合 | 青青青手机版视频在线观看 | 一极毛片 | 福利网站在线播放 | 久久久久久久男人的天堂 | 国内精品久久久久久久久久久久 | 亚洲精品一区亚洲精品 | 四虎www成人影院免费观看 | 日韩字幕无线乱码 | 伊人不卡久久大香线蕉综合影院 | 精品国产一区二区三区香蕉沈先生 | 成年女人在线视频 | 成人免费aa在线观看 | 羞羞在线| 国产成人精品视频一区 | 精品国产高清a毛片无毒不卡 | 国产成人刺激视频在线观看 | 国产亚洲第一伦理第一区 | 欧美胖老妇 | 亚洲欧洲国产成人精品 | 国产精品福利视频主播真会玩 | 欧美韩国日本一区 | 俄罗斯aaaa一级毛片 | 精品成人免费一区二区在线播放 | 在线观看一区二区精品视频 | 99久久精品国产自免费 | 久久国产精品麻豆映画 | 免费精品美女久久久久久久久久 | 久久99热这里只有精品 | 日韩波多野结衣 | 久久久久久天天夜夜天天 | 亚洲va欧美va人人爽夜夜嗨 | 精品午夜久久影视 |