橋梁模式的定義 定義: 將抽象和實現解耦, 使得兩者可以獨立的變化 通俗的說, 就是一個類調用另一個類中的方法, 需要一個橋梁, 通過聚合的關係調用 其類圖如下: 其中角色說明如下: 抽象角色的部分實現是由實現角色完成的 實現化角色代碼: 具體實現化角色代碼: 抽象化角色代碼: 具體抽象化角色代碼: ...
橋梁模式的定義
定義: 將抽象和實現解耦, 使得兩者可以獨立的變化
通俗的說, 就是一個類調用另一個類中的方法, 需要一個橋梁, 通過聚合的關係調用
其類圖如下:
其中角色說明如下:
- Abstraction 抽象化角色: 它的主要職責是定義出該角色的行為, 同時保存一個對實現化角色的引用, 一般是抽象類
- Implementor 實現化角色: 介面或抽象類, 定義角色必須的行為和屬性
- RefinedAbstraction 修正抽象化角色: 它引用實現化角色對抽象化角色進行修正
- ConcreteImplementor 具體實現化角色: 它實現介面或抽象類定義的方法和屬性
抽象角色的部分實現是由實現角色完成的
實現化角色代碼:
具體實現化角色代碼:
抽象化角色代碼:
具體抽象化角色代碼:
場景類代碼:
橋梁模式是一個很簡單的模式, 它只是使用了類間的聚合關係、繼承、覆寫等常用功能, 但是它卻提供了一個非常清晰、穩定的架構.
橋梁模式的應用
橋梁模式的優點:
- 抽象和實現分離. 這是橋梁模式的主要特點, 它完全是為瞭解決繼承的缺點而提出的設計模式. 在該模式下,實現可以不受抽象的約束,不用再綁定在一個固定的抽象層次上
- 優秀的擴充能力.
- 實現細節對客戶透明. 客戶不用關心細節的實現, 它已經由抽象層通過聚合關係完成了封裝
橋梁模式的使用場景:
- 不希望或不適用使用繼承的場景. 例如繼承層次過濾、無法更細化設計顆粒等場景
- 介面或抽象類不穩定的場景.
- 重用性要求較高的場景. 設計的顆粒度越細,則被重用的可能性就越大, 而採用繼承則受父類的限制, 不可能出現太細的顆粒度
使用橋梁模式主要考慮如何拆分抽象和實現,並不是一設計繼承就要考慮使用該模式. 橋梁模式的意圖還是對變化的封裝, 儘量把可能變化的因素封裝到最細、最小的邏輯單元中,避免風險擴散.因此在進行系統設計時,發現類的繼承有N層時,可以考慮使用橋梁模式
橋梁模式在Java應用中的一個非常典型的例子就是JDBC驅動器。JDBC為所有的關係型資料庫提供一個通用的界面。一個應用系統動態地選擇一個合適的驅動器,然後通過驅動器向資料庫引擎發出指令。這個過程就是將抽象角色的行為委派給實現角色的過程。
抽象角色可以針對任何資料庫引擎發出查詢指令,因為抽象角色並不直接與資料庫引擎打交道,JDBC驅動器負責這個底層的工作。由於JDBC驅動器的存在,應用系統可以不依賴於資料庫引擎的細節而獨立地演化;同時資料庫引擎也可以獨立於應用系統的細節而獨立的演化。兩個獨立的等級結構如下圖所示,左邊是JDBC API的等級結構,右邊是JDBC驅動器的等級結構。應用程式是建立在JDBC API的基礎之上的。
應用系統作為一個等級結構,與JDBC驅動器這個等級結構是相對獨立的,它們之間沒有靜態的強關聯。應用系統通過委派與JDBC驅動器相互作用,這是一個橋梁模式的例子。
JDBC的這種架構,把抽象部分和具體部分分離開來,從而使得抽象部分和具體部分都可以獨立地擴展。對於應用程式而言,只要選用不同的驅動,就可以讓程式操作不同的資料庫,而無需更改應用程式,從而實現在不同的資料庫上移植;對於驅動程式而言,為資料庫實現不同的驅動程式,並不會影響應用程式。