天天看點

《設計模式之禅》——中介者模式1.中介者模式的應用2.中介者模式的實際應用3.中介者模式最佳實踐

       定義:Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.(用一個中介對象封裝一系列的對象互動,中介者使各對象不需要顯示地互相作用,進而使其耦合松散,而且可以獨立地改變它們之間的互動。)

        中介者模式的通用類圖如下:

《設計模式之禅》——中介者模式1.中介者模式的應用2.中介者模式的實際應用3.中介者模式最佳實踐

從類圖中看,中介者模式由以下幾部分組成:

  • Mediator抽象中介者角色:抽象中介者角色定義統一的接口,用于個同僚角色之間的通訊。
  • Concrete Mediator具體中介者角色:具體中介者角色通過協調同僚角色實作協作行為,是以它必須依賴于各同僚角色。
  • Colleague同僚角色:每一個同僚角色都知道中介者角色,而且與其它的同僚角色通訊的時候,一定要通過中介者角色協作。每個同僚類的行為分為兩種:一種是同僚本身的行為,比如改變對象本身的狀态,處理自己的行為等,這種方法叫做自發行為(Self-Method),與其它的同僚類或中介者沒有任何的依賴;第二種是必須依賴中介者才能完成的行為,叫做依賴方法(Dep-Method)。

1.中介者模式的應用

1.1中介者模式的優點

       中介者模式的優點就是減少類間的依賴,把原有的一對多的依賴變成了一對一的依賴,同僚類隻依賴中介者,減少了依賴,當然同時也降低了類間的耦合。

1.2中介者模式的缺點

       中介者模式的缺點就是中介者會膨脹得很大,而且邏輯複雜,原本N個對象直接的互相依賴關系轉換為中介者和同僚類的依賴關系,同僚類越多,中介者的邏輯就越複雜。

1.3中介者模式的使用場景

       中介者模式簡單,但是簡單不代表容易使用,很容易被誤用。在面向對象的程式設計中,對象和對象之間必然會有依賴關系,如果某個類和其他類沒有任何互相依賴的關系,那這個類就是一個“孤島”,在項目中就沒有存在的必要了!就像某個人如果永遠獨立生活,與任何人都沒有關系,那這個人基本上就算是野人了——排除在人類這個定義之外。

       類之間的依賴關系式必然存在的,一個類依賴多個類的情況也是存在的,存在即合理,那是否可以說隻要有多個依賴關系就考慮使用中介者模式呢?答案是否定的。中介者模式未必能幫你把原本淩亂的邏輯整理得清清楚楚,而且中介者模式也是有缺點的,這個缺點在使用不當時會被放大,比如原本就簡單的幾個對象依賴關系,如果為了使用模式而加入了中介者,必然導緻中介者的邏輯複雜化,是以中介者模式的使用需要“量力而行”!中介者模式适用于多個對象之間緊密耦合的情況,緊密耦合的标準是:在類圖中出現了蜘蛛網狀結構。在這種情況下一定要考慮使用中介者模式,這有利于蜘蛛網梳理為星型結構,使原本複雜混亂的關系變得清晰簡單。

2.中介者模式的實際應用

  • 機場排程中心
  • MVC架構
  • 媒體網關
  • 中介服務

3.中介者模式最佳實踐

        中介者模式是一個非常好的封裝模式,也是一個很容易被濫用的模式。使用中介者模式必然會帶來中介者的膨脹問題。大家可以在如下的情況下嘗試使用中介者模式:

  • N個對象之間産生了互相的依賴關系(N>2)。
  • 多個對象有依賴關系,但是依賴的行為尚不确定或者有發生改變的可能,在這種情況下一般建議采用中介者模式,降低變更引起的風險擴散。
  • 産品開發。一個明顯的例子就是MVC架構,把中介者模式應用到産品中,可以提升産品的性能和擴充性,但是對于項目開發就未必,是以項目是以傳遞投産為目标,而産品則是以穩定、高效、擴充為宗旨。

其它設計模式内容戳這裡。

繼續閱讀