2014年10月8日 星期三

Bridge

目的

Decouple an abstraction from its implementation so that the two can vary independently.
(將實作體系與抽象體系分離開來,讓兩者能各自更動更自演進。[1])





一個抽象體通常會對應數種實作方式,或者是有多種類型,例如 View 會有各式各樣的 View,包括 ScrollView, TableView 等等。每種 View 在不同作業系統上會有不一樣的實作方式。所以如果希望可以跨 Windows、Mac OS X ,通常會以繼承的方式達到目的(如下圖):


根據上述的繼承架構,如果我們多增加了新的 View: TextView,也新增了一個平臺:Java's Virtual Machine,Class Diagram 會變成:

這樣的架構變成十分難以修改、擴充與再利用。然而,我們會發現到抽象體在各平台中的行為是一致的,不同的是實作方式,這些實作方式會根據平臺不同而不同。

Bridge pattern 可以解決此問題。Bridge pattern 概念就是把介面與實作分開。實作可以被動態設定與抽換,但介面並沒有更動。

Bridge 的 UML Class Diagram: 

於是套用 Bridge pattern 到開頭範例,其 Class Diagram 變成:



 整個架構變得更加簡潔、彈性。

範例程式:
範例程式與 Class Diagram 的對應關係:
  • Client <==>ViewController
  • Abstraction <==> View
  • Implementor <==>ViewImp
  • RefinedAbstraction <==>ScrollView, TableView
  • ConcreteImplementorA <==> WindowsViewImp
  • ConcreteImplementorB <==> MacOSXViewImp

如果對 Stragtegy 熟悉的讀者會發現 Bridge 和 Strategy 的 Class Diagram 幾乎一模一樣,不過他們專注的問題是不一樣的。
在分類上,Bridge 屬於 Structural Patterns; Strategy 屬於 Behavioral Patterns。
Bridge 主要概念是在架構上可以分離抽象體與實作,也就是說 一個抽象體可以使用不同的實作;而 Strategy 則主要是強調在執行時可以改變物件的行為。


[1] "物件導向設計模式", Gamma, Johnson, Helm, Vlissides 著, 葉秉哲譯
[2] "Bridge Design Pattern", http://sourcemaking.com/design_patterns/bridge