橋接模式 Bridge
動機(Motivation)
- 因爲某些類型的固有的實現邏輯,使得它們具備兩個變化的維度,乃至多個維度的變化。
- 如何應對這種「多維度的變化」?如何利用面向對象技術來使得類型能夠輕鬆地沿着兩個乃至多個方向變化,而不引入額外的複雜度?
模式定義
將抽象部分(業務功能)與實現部分(平臺實現)分離,使它們均可以獨立地變化。——《設計模式》GoFjava
結構(Structure)
要點總結
- Bridge 模式使用「對象間的組合關係」解耦了抽象和實現之間固有的綁定關係,使得抽象和實現能夠沿着各自的維度來變化。所謂抽象和實現沿着各自維度的變化,即「子類化」它們。
- Bridge 模式有時候相似於多繼承方案,可是多繼承方案每每違背單一職責原則(即一個類只有一個變化的緣由),複用性比較差。Bridge 模式是比多繼承方案更好的解決方法。
- Bridge 模式的應用通常在「兩個很是強的變化維度」,有時一個類也有多於兩個的變化維度,這時可使用 Bridge 的擴展模式。
代碼實現
模擬場景:電腦城銷售電腦
分析該場景,電腦存在兩個方向的變化:
- 電腦類型,如臺式機、筆記本、Pad、服務器等
- 電腦品牌,如聯想、戴爾、神州、蘋果等
實現方式
-
使用繼承,實現類圖以下:git
使用繼承,不管是新增一個類型仍是新增一個品牌,都將引發另外一個維度的變化,這顯然不是咱們想要的。
-
使用橋接模式,實現類圖以下:github
能夠看出,使用橋接模式後,不管新增一個類型仍是新增一個品牌,都不會影響到另一個維度的變化,並且經過組合也明顯下降了子類的膨脹。
示例代碼
橋接模式-示例代碼設計模式