23種設計模式之橋樑模式

橋樑模式的定義

定義: 將抽象和實現解耦, 使得兩者可以獨立的變化

通俗的說, 就是一個類調用另一個類中的方法, 需要一個橋樑, 通過聚合的關係調用

其類圖如下:

23種設計模式之橋樑模式

其中角色說明如下:

  1. Abstraction 抽象化角色: 它的主要職責是定義出該角色的行為, 同時保存一個對實現化角色的引用, 一般是抽象類
  2. Implementor 實現化角色: 接口或抽象類, 定義角色必須的行為和屬性
  3. RefinedAbstraction 修正抽象化角色: 它引用實現化角色對抽象化角色進行修正
  4. ConcreteImplementor 具體實現化角色: 它實現接口或抽象類定義的方法和屬性

抽象角色的部分實現是由實現角色完成的

實現化角色代碼:

23種設計模式之橋樑模式

具體實現化角色代碼:

23種設計模式之橋樑模式

抽象化角色代碼:

23種設計模式之橋樑模式

具體抽象化角色代碼:

23種設計模式之橋樑模式

場景類代碼:

23種設計模式之橋樑模式

橋樑模式是一個很簡單的模式, 它只是使用了類間的聚合關係、繼承、覆寫等常用功能, 但是它卻提供了一個非常清晰、穩定的架構.

橋樑模式的應用

橋樑模式的優點:

  1. 抽象和實現分離. 這是橋樑模式的主要特點, 它完全是為了解決繼承的缺點而提出的設計模式. 在該模式下,實現可以不受抽象的約束,不用再綁定在一個固定的抽象層次上
  2. 優秀的擴充能力.
  3. 實現細節對客戶透明. 客戶不用關心細節的實現, 它已經由抽象層通過聚合關係完成了封裝

橋樑模式的使用場景:

  1. 不希望或不適用使用繼承的場景. 例如繼承層次過濾、無法更細化設計顆粒等場景
  2. 接口或抽象類不穩定的場景.
  3. 重用性要求較高的場景. 設計的顆粒度越細,則被重用的可能性就越大, 而採用繼承則受父類的限制, 不可能出現太細的顆粒度

使用橋樑模式主要考慮如何拆分抽象和實現,並不是一設計繼承就要考慮使用該模式. 橋樑模式的意圖還是對變化的封裝, 儘量把可能變化的因素封裝到最細、最小的邏輯單元中,避免風險擴散.因此在進行系統設計時,發現類的繼承有N層時,可以考慮使用橋樑模式


橋樑模式在Java應用中的一個非常典型的例子就是JDBC驅動器。JDBC為所有的關係型數據庫提供一個通用的界面。一個應用系統動態地選擇一個合適的驅動器,然後通過驅動器向數據庫引擎發出指令。這個過程就是將抽象角色的行為委派給實現角色的過程。

抽象角色可以針對任何數據庫引擎發出查詢指令,因為抽象角色並不直接與數據庫引擎打交道,JDBC驅動器負責這個底層的工作。由於JDBC驅動器的存在,應用系統可以不依賴於數據庫引擎的細節而獨立地演化;同時數據庫引擎也可以獨立於應用系統的細節而獨立的演化。兩個獨立的等級結構如下圖所示,左邊是JDBC API的等級結構,右邊是JDBC驅動器的等級結構。應用程序是建立在JDBC API的基礎之上的。

23種設計模式之橋樑模式

應用系統作為一個等級結構,與JDBC驅動器這個等級結構是相對獨立的,它們之間沒有靜態的強關聯。應用系統通過委派與JDBC驅動器相互作用,這是一個橋樑模式的例子。

JDBC的這種架構,把抽象部分和具體部分分離開來,從而使得抽象部分和具體部分都可以獨立地擴展。對於應用程序而言,只要選用不同的驅動,就可以讓程序操作不同的數據庫,而無需更改應用程序,從而實現在不同的數據庫上移植;對於驅動程序而言,為數據庫實現不同的驅動程序,並不會影響應用程序。


分享到:


相關文章: