知識(shí)整理NO.1-中介模式(Mediator)

中介模式(Mediator)

u=2709874420,256028894&fm=21&gp=0.jpg

背景

在面向?qū)ο蟮能浖O(shè)計(jì)與開發(fā)過程中,根據(jù)“單一職責(zé)原則”,我們應(yīng)該盡量將對(duì)象細(xì)化,使其只負(fù)責(zé)或呈現(xiàn)單一的職責(zé),即將行為分布到各個(gè)對(duì)象中。

對(duì)于一個(gè)模塊或者系統(tǒng),可能由很多對(duì)象構(gòu)成,而且這些對(duì)象之間可能存在相互的引用,在最壞的情況下,每一個(gè)對(duì)象都知道其他所有的對(duì)象,這無疑復(fù)雜化了對(duì)象之間的聯(lián)系。雖然將一個(gè)系統(tǒng)分割成許多對(duì)象通常可以增強(qiáng)可復(fù)用性,但是對(duì)象間相互連接的激增又會(huì)降低其可復(fù)用性,大量的相互連接使得一個(gè)對(duì)象似乎不太可能在沒有其他對(duì)象的支持下工作,系統(tǒng)表現(xiàn)為一個(gè)不可分割的整體,而且對(duì)系統(tǒng)的行為進(jìn)行任何較大的改動(dòng)都會(huì)十分困難。結(jié)果是你不得不定義大量的子類以定制系統(tǒng)的行為。因此,為了減少對(duì)象兩兩之間復(fù)雜的引用關(guān)系,使之成為一個(gè)松耦合的系統(tǒng),我們需要使用中介者模式.

問題

面對(duì)一系列的相交互對(duì)象。怎么樣保證使各對(duì)象不需要顯式地相互引用,使其耦合松散?

解決方案

中介者模式:用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。中介者模式又稱為調(diào)停者模式。

剖析

意圖

定義對(duì)象封裝一些列對(duì)象間交互。Mediator

定義

  • 用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互。中介者是各對(duì)象不需要顯示地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變他們之間的交互。
  • 設(shè)計(jì)中介去耦
  • 在交互對(duì)象間,促進(jìn)多對(duì)多關(guān)系

本質(zhì)

  • 封裝交互

UML

MediatorStruct.png

圖例解讀

  • 抽象中介者:定義好同事類對(duì)象到中介者對(duì)象的接口,用于各個(gè)同事類之間的通信。一般包括一個(gè)或幾個(gè)抽象的事件方法,并由子類去實(shí)現(xiàn)。

  • 中介者實(shí)現(xiàn)類:從抽象中介者繼承而來,實(shí)現(xiàn)抽象中介者中定義的事件方法。從一個(gè)同事類接收消息,然后通過消息影響其他同時(shí)類。

  • 同事類:如果一個(gè)對(duì)象會(huì)影響其他的對(duì)象,同時(shí)也會(huì)被其他對(duì)象影響,那么這兩個(gè)對(duì)象稱為同事類。在類圖中,同事類只有一個(gè),這其實(shí)是現(xiàn)實(shí)的省略,在實(shí)際應(yīng)用中,同事類一般由多個(gè)組成,他們之間相互影響,相互依賴。同事類越多,關(guān)系越復(fù)雜。并且,同事類也可以表現(xiàn)為繼承了同一個(gè)抽象類的一組實(shí)現(xiàn)組成。在中介者模式中,同事類之間必須通過中介者才能進(jìn)行消息傳遞。

現(xiàn)實(shí)例子

worldApply.png

應(yīng)用場(chǎng)景

  • 對(duì)象間的交互雖定義明確然而非常復(fù)雜,導(dǎo)致一組對(duì)象彼此相互依賴而難以理解;

  • 因?yàn)閷?duì)象引用了許多其他對(duì)象并通訊,導(dǎo)致對(duì)象難以復(fù)用。

  • 想要定制一個(gè)分布在多個(gè)類中的邏輯或行為,又不想生成太多子類。

  • N個(gè)對(duì)象之間產(chǎn)生了相互依賴的關(guān)系

  • 多個(gè)對(duì)象有依賴關(guān)系,但是依賴行為尚不確定或者發(fā)生改變的可能

  • 產(chǎn)品研發(fā)

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 松散耦合
  • 集中控制交互
  • 多對(duì)多變成一對(duì)多
  • 較少了子類的生成
  • 簡(jiǎn)化了各同事類的設(shè)計(jì)與實(shí)現(xiàn)
  • 簡(jiǎn)化了對(duì)象協(xié)議
  • 對(duì)對(duì)象如何協(xié)作進(jìn)行了抽象
  • 減少類之間的依賴,把原有的一對(duì)多的依賴變成了一對(duì)一的依賴,同事類只依賴中介者,減少了依賴,當(dāng)然同時(shí)也降低了類之間的耦合

缺點(diǎn)

  • 過度集中化
  • 中介者膨脹的很大,而且邏輯復(fù)雜

模式導(dǎo)讀

在面向?qū)ο缶幊讨?,一個(gè)類必然會(huì)與其他的類發(fā)生依賴關(guān)系,完全獨(dú)立的類是沒有意義的。一個(gè)類同時(shí)依賴多個(gè)類的情況也相當(dāng)普遍,既然存在這樣的情況,說明,一對(duì)多的依賴關(guān)系有它的合理性,適當(dāng)?shù)氖褂弥薪檎吣J娇梢允乖玖鑱y的對(duì)象關(guān)系清晰,但是如果濫用,則可能會(huì)帶來反的效果。一般來說,只有對(duì)于那種同事類之間是網(wǎng)狀結(jié)構(gòu)的關(guān)系,才會(huì)考慮使用中介者模式??梢詫⒕W(wǎng)狀結(jié)構(gòu)變?yōu)樾菭罱Y(jié)構(gòu),使同事類之間的關(guān)系變的清晰一些。

中介者模式是一種比較常用的模式,也是一種比較容易被濫用的模式。對(duì)于大多數(shù)的情況,同事類之間的關(guān)系不會(huì)復(fù)雜到混亂不堪的網(wǎng)狀結(jié)構(gòu),因此,大多數(shù)情況下,將對(duì)象間的依賴關(guān)系封裝的同事類內(nèi)部就可以的,沒有必要非引入中介者模式。濫用中介者模式,只會(huì)讓事情變的更復(fù)雜。

  • 適當(dāng)?shù)厥褂弥薪檎吣J娇梢员苊馔骂愔g的過度耦合,使得各同事類之間可以相對(duì)獨(dú)立地使用。

  • 使用中介者模式可以將對(duì)象間一對(duì)多的關(guān)聯(lián)轉(zhuǎn)變?yōu)橐粚?duì)一的關(guān)聯(lián),使對(duì)象間的關(guān)系易于理解和維護(hù)。

  • 使用中介者模式可以將對(duì)象的行為和協(xié)作進(jìn)行抽象,能夠比較靈活的處理對(duì)象間的相互作用。

經(jīng)驗(yàn)法則

  • 責(zé)任鏈、命令、中介和觀察者,解決如何解耦發(fā)送方和接收方的,但是不同的權(quán)衡。責(zé)任鏈通過發(fā)送方請(qǐng)求找到接受方。命令模式通常與一個(gè)子類制定 發(fā)送-接收連接。中介者間接有發(fā)送方和接受引用。觀察者定義了一個(gè)解耦的接口,允許多個(gè)接收器運(yùn)行時(shí)配置。
  • 中介和觀察者都是競(jìng)爭(zhēng)者模式。他們之間不同的是,觀察者模式通過引入觀察者 和主題 對(duì)象來通信,而中介者封裝其他對(duì)象之間的通信。
  • 另一方面,中介可以利用觀察者動(dòng)態(tài)觀察,與他們交流
  • 與外觀模式相似,抽象存在類的功能。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容