23种设计模式之中介者模式
中介者模式的定義
中介者模式, 當(dāng)多個(gè)類(lèi)彼此關(guān)聯(lián), 會(huì)增大耦合性, 這時(shí)各個(gè)模塊通過(guò)中介者進(jìn)行交流, 每個(gè)模塊只負(fù)責(zé)自己的業(yè)務(wù)邏輯, 不屬于自己的就丟給中介者, 降低耦合
定義: 用一個(gè)中介對(duì)象封裝一系列的對(duì)象交互, 中介者使各對(duì)象不需要顯示的相互作用,從而使其耦合松散,而且可以獨(dú)立的改變他們之間的交互.
通用類(lèi)圖如下:
?
由以下幾部分組成:
抽象中介者代碼:
?
具體中介者代碼:
?
抽象同事類(lèi)代碼:
?
這個(gè)類(lèi)代碼非常簡(jiǎn)單,就是為了建立這個(gè)中介而服務(wù)的
具體同事類(lèi)代碼:
?
為什么同事類(lèi)要使用構(gòu)造函數(shù)注入中介者,而中介者使用 getter/setter 方式注入同事類(lèi)呢? 這是因?yàn)橥骂?lèi)必須擁有中介者, 而中介者卻可以只有部分同事類(lèi).
中介者模式的應(yīng)用
中介者模式的優(yōu)點(diǎn):
減少了類(lèi)間的依賴(lài), 把原有的一對(duì)多的以來(lái)變成了一對(duì)一的依賴(lài), 同事類(lèi)只依賴(lài)中介者,減少了依賴(lài),當(dāng)然同時(shí)也降低了類(lèi)間的耦合
中介者模式的缺點(diǎn):
中介者會(huì)膨脹得很大,而且邏輯復(fù)雜, 原本N個(gè)對(duì)象直接的相互依賴(lài)關(guān)系轉(zhuǎn)換成中介者和同事類(lèi)的依賴(lài)關(guān)系, 同事類(lèi)越多, 中介者的邏輯就越復(fù)雜.
中介者模式的使用場(chǎng)景:
中介者模式適用于多個(gè)對(duì)象之間緊密耦合的情況, 緊密耦合的標(biāo)準(zhǔn)是: 在類(lèi)圖中出現(xiàn)了蜘蛛網(wǎng)狀結(jié)構(gòu). 在這種情況下一定要考慮使用中介者模式, 這有利于把蜘蛛網(wǎng)梳理為星型結(jié)構(gòu),使原本復(fù)雜混亂的關(guān)系變得清晰簡(jiǎn)單
中介者模式的實(shí)際應(yīng)用
中介者模式也叫調(diào)停者模式, 什么意思呢? 一個(gè)對(duì)象要和N多個(gè)對(duì)象交流, 就像對(duì)象間的戰(zhàn)爭(zhēng), 很混亂. 這時(shí)需要加入一個(gè)中心, 所有的類(lèi)都和中心交流, 中心說(shuō)怎么處理就怎么處理.舉一些常見(jiàn)的例子:
1.機(jī)場(chǎng)調(diào)度中心.
在每個(gè)機(jī)場(chǎng)都會(huì)看到有一個(gè)"XX機(jī)場(chǎng)調(diào)度中心", 他就是具體的中介者, 用來(lái)調(diào)度每一架要降落和起飛的飛機(jī).如果沒(méi)有機(jī)場(chǎng)調(diào)度中心, 飛機(jī)飛到機(jī)場(chǎng)了, 飛行員要先看看有沒(méi)有飛機(jī)和自己一起降落, 有沒(méi)有空跑道燈,這是在難以想象.
2.MVC框架
MVC框架其中的 C(Controller)就是一個(gè)中介者, 叫做前端控制器, 它的作用就是把M(Model, 業(yè)務(wù)邏輯)和V(View, 視圖)隔離開(kāi),協(xié)調(diào)M和V協(xié)同工作, 把M運(yùn)行的結(jié)果和V代表的視圖融合成一個(gè)前端可以展示的頁(yè)面,減少M(fèi)和V的依賴(lài)關(guān)系.
3.媒體網(wǎng)關(guān)
媒體網(wǎng)關(guān)也是一個(gè)典型的中介者模式, 比如使用MSN時(shí),張三發(fā)消息給李四, 其過(guò)程應(yīng)該是這樣的: 張三發(fā)送消息, MSN服務(wù)器(中介者)接收到消息, 查找李四,把消息發(fā)送到李四, 同時(shí)通知張三, 消息已經(jīng)發(fā)送. 在這里, MSN服務(wù)器就是一個(gè)中轉(zhuǎn)站, 負(fù)責(zé)協(xié)調(diào)兩個(gè)客戶(hù)端的信息交流.
4.中介服務(wù)
現(xiàn)在中介服務(wù)非常多, 如租房中介等, 這些也是中介模式的具體體現(xiàn).
中介者模式很少用到接口或者抽象類(lèi), 這與依賴(lài)倒置原則是沖突的, 這是為什么呢? 首先, 既然是同事類(lèi)而不是兄弟類(lèi)(有相同的血緣), 那就說(shuō)明這些類(lèi)之間是協(xié)作關(guān)系, 完成不同的任務(wù), 處理不同的業(yè)務(wù), 所以不能在抽象類(lèi)或接口中嚴(yán)格定義同事類(lèi)必須具有的方法(從這點(diǎn)也可以看出繼承是高侵入性的).
一個(gè) 中介者抽象類(lèi)一般只有一個(gè)實(shí)現(xiàn)類(lèi), 除非中介者邏輯非常復(fù)雜, 代碼量非常大,這時(shí)才會(huì)出現(xiàn)多個(gè)中介者的情況. 對(duì)于中介者來(lái)說(shuō),抽象已經(jīng)沒(méi)有太多的必要.
中介者模式也不要濫用, 可以在如下情況下嘗試使用中介者模式:
總結(jié)
以上是生活随笔為你收集整理的23种设计模式之中介者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux 查看指定ip的路由
- 下一篇: PHP为什么empty可以访问不存在的索