设计模式之中介者
中介者模式介紹
中介者模式中介者模式是一種行為設(shè)計(jì)模式,能讓你減少對(duì)象之間混亂無(wú)序的依賴關(guān)系,該模式會(huì)限制對(duì)象之間的直接交互,迫使它們通過(guò)一個(gè)中介者對(duì)象進(jìn)行合作。
中介者模式顧名思義,可以用我們平時(shí)生活中的房產(chǎn)中介去理解。房產(chǎn)中介就是房子擁有者和想買房子人直接的橋梁,不讓二者直接交易,通過(guò)中介去做橋梁,進(jìn)行溝通和交易。
中介者模式建議你停止組件之間的直接交流并使其相互獨(dú)立。這些組件必須調(diào)用特殊的中介者對(duì)象,通過(guò)中介者對(duì)象重定向調(diào)用行為,以間接的方式進(jìn)行合作。最終,組件僅依賴于一個(gè)中介者類,無(wú)需與多個(gè)組件耦合。
類所擁有的依賴關(guān)系越少,就越易于修改、擴(kuò)展或復(fù)用。
可以為所有類型的對(duì)話框抽取通用接口,進(jìn)一步消弱其依賴性;接口中將聲明一個(gè)所有表單元素都能使用的通知方法,可用于將元素中發(fā)生的事件通知給對(duì)話框,所有實(shí)現(xiàn)了該接口的對(duì)話框都能使用這個(gè)提交按鈕。
中介者模式結(jié)構(gòu)
1、組件
是包含業(yè)務(wù)邏輯的類。每一個(gè)組件都有一個(gè)指向中介者的引用,該引用被聲明為中介者接口類型。組件并不知道中介者所屬的類,這樣就可通過(guò)將其連接到不同的中介者使其能在其他程序中復(fù)用。
2、中介者接口
聲明了與組件交流的方法,但通常僅包括一個(gè)通知方法。組件可將任意上下文(自身)作為該方法的參數(shù),只有這樣接收組件和發(fā)送者類之間才不會(huì)耦合。
3、具體中介者
封裝了多種組件間的關(guān)系。具體中介者通常會(huì)保存所有組件的引用并對(duì)其進(jìn)行管理,甚至有時(shí)會(huì)對(duì)其生命周期進(jìn)行管理。
4、通知邏輯
組件并不知道其他組件的情況。如果組件內(nèi)發(fā)生了重要事情,它只能通知中介者。中介者收到消息后能輕易地確定發(fā)送者,或許已足以去判斷接下來(lái)需要觸發(fā)的組件。
對(duì)于組件來(lái)說(shuō),中介者其實(shí)就是一個(gè)黑箱。發(fā)送者不知道最終會(huì)由誰(shuí)來(lái)處理自己的請(qǐng)求,接收者也不知道最初的誰(shuí)發(fā)出了請(qǐng)求。
適用場(chǎng)景
1 ?當(dāng)某些對(duì)象和其他對(duì)象緊密耦合難以進(jìn)行修改時(shí)
2 ?一個(gè)組件過(guò)于依賴其他組件而無(wú)法在不同應(yīng)用中復(fù)用時(shí)
3 ?為了能在不同情景下復(fù)用一些基本行為,導(dǎo)致你需要被迫場(chǎng)景大量組件子類時(shí)
實(shí)現(xiàn)方式
找到一組當(dāng)前緊密耦合的類且提供其獨(dú)立性能帶來(lái)更大好處的類。
聲明中介者接口并描述中介者和各種組件之間所需的交流接口(一個(gè)接收組件的方法就夠了)。
實(shí)現(xiàn)具體中介者類。
讓中介者負(fù)責(zé)組件對(duì)象的創(chuàng)建和銷毀。
組件必須保存對(duì)于中介對(duì)象的引用。
修改組件代碼,使其可調(diào)用中介者的通知方法,而非其他組件的方法。然后將調(diào)用其他組件的代碼抽取到中介者類中,并在中介者接收到該組件通知時(shí)執(zhí)行這些代碼。
滿足單一職責(zé)、開(kāi)閉原則、減輕應(yīng)用中多個(gè)組件間的耦合情況、方便復(fù)用各個(gè)組件。
中介者將系統(tǒng)中組件的溝通行為中心化。各組件只知道中介者對(duì)象,無(wú)法直接相互交流。
中介者的主要目標(biāo)是消除一系列系統(tǒng)組件之間的相互依賴。這些組件將依賴于同一個(gè)中介者對(duì)象。
Demo
中介接口和房產(chǎn)鏈家
????///?<summary>///?房產(chǎn)中介接口///?</summary>public?interface?IHouseMediator?{void?Notify(object?sneder,string?ev);}///?<summary>///?鏈家???房產(chǎn)中介。實(shí)現(xiàn)房產(chǎn)中介接口///?</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("客戶端?執(zhí)行First?TJ");tjHouse.FirstSell();Console.ReadLine();Console.WriteLine("客戶端?執(zhí)行Second?XA");xiHouse.SecondSell();Console.ReadKey();}}小寄語(yǔ)
人生短暫,我不想去追求自己看不見(jiàn)的,我只想抓住我能看的見(jiàn)的。
原創(chuàng)不易,給個(gè)關(guān)注。
我是阿輝,感謝您的閱讀,如果對(duì)你有幫助,麻煩關(guān)注、點(diǎn)贊、轉(zhuǎn)發(fā) 謝謝。
往期推薦
設(shè)計(jì)模式總覽
設(shè)計(jì)模式之簡(jiǎn)單工廠
設(shè)計(jì)模式之抽象工廠
設(shè)計(jì)模式之建造者
設(shè)計(jì)模式之原型
設(shè)計(jì)模式之單例
設(shè)計(jì)模式之適配器
設(shè)計(jì)模式之橋接
設(shè)計(jì)模式之組合
設(shè)計(jì)模式之裝飾器
設(shè)計(jì)模式之外觀
設(shè)計(jì)模式之享元
設(shè)計(jì)模式之代理
設(shè)計(jì)模式之責(zé)任鏈
設(shè)計(jì)模式之命令
設(shè)計(jì)模式之迭代器
總結(jié)
- 上一篇: 终于来了!微软正式推出 VS Code
- 下一篇: ASP.NET Core自定义响应内容