--- title: 'Bridge 橋接模式' disqus: kyleAlien --- Bridge 橋接模式 === ## Overview of Content 如有引用參考請詳註出處,感謝 :smile: **避免兩個層次發生==靜態繼承關係==** (被迫繼承方法),**橋接就是連接抽象與實做的橋梁**,也就是將實做隔離出來,**透過注入,注入實做類別** :::success * 如果喜歡讀更好看一點的網頁版本,可以到我新做的網站 [**DevTech Ascendancy Hub**](https://devtechascendancy.com/) 本篇文章對應的是 [**Bridge 橋接模式 | 解說實現 | 物件導向設計**](https://devtechascendancy.com/object-oriented_design_bridge/) ::: [TOC] ## 使用場景 * 一個類別存在兩個維度 (**讓抽象依賴抽象,而兩者抽象又有不同意義**) > 維度: **資料、實做** :::info * **抽象工廠 & Bridge** 以抽象工廠的實做技術來說,也是透過抽向來依賴抽象,不過抽象工廠的接口兩者具有相同目標,而橋接模式則沒有這個設定 ::: * 不希望使用 **繼承** 或因為多層次繼承 **導制系統類別的個數增加** :::warning * 繼承缺點:**強入侵** 設計的粒度越小,被重用的機會會越高,但是以繼承這個行為來說其粒度只會越來越高(代價過大,中間類不可隨意修改實做) >  ::: ### Bridge 定義 & UML * Bridge 定義 將抽象和實現解耦,使的抽象與實現可以 **獨立** 變化 * Bridge 角色介紹 | Bridge 角色 | 說明 | | - | - | | Abstraction(抽象) | 定義出該角色的抽象實現,同時內部保存了一個 Implementor 對象 | | Implementor(大部份是抽象、接口) | 抽象行為 | | RefinedAbstraction | 實現 Abstraction | | ConcreteImplementor | 實現 Implementor 行為 | > 橋接模式的重點在於 **建構函數注入**,透過注入不同類來達成不同的結果 > >  ### 優缺點 * 優點 : 1. 分離抽象 & 實做,靈活度高 2. 由於抽象行為抽出,可以讓擴充能力變高 3. 符合依賴倒置原則,Abstraction 依賴抽象對象,所以可以透明的使用、替換 * 缺點 : 1. 不易設計,因為分離會導至檔案量增加,是否有需要用要考量 ### 注意事項 * Bridge 模式主要考慮如何拆分抽象、現實(行為),**Bridge 模式** 主要還是針拆出易變化的行為,避免風險擴散 > 發現繼承有 N 層時就可以考慮實用橋樑模式 * 橋樑模式 與 策略模式的差異? 兩者之間的主要缺別是 **目的**;策略模式的目的是,替換算法;橋樑模式的目的是,替換行為 ## Bridge 實現 ### Bridge 標準 1. **Implementor 接口**:定義抽象行為的方法 ```kotlin= interface Additives { fun addItem() : String } ``` 2. **ConcreteImplementor 類**:實現行為,這個實現代表了 **不同的業務邏輯** ```kotlin= class Sugar : Additives { override fun addItem(): String { return "add sugar finish" } } class Milk : Additives { override fun addItem(): String { return "add milk finish" } } ``` 3. **Abstraction 抽象類**:定義共通抽象方法,並 **依賴於 Additives** ```java= abstract class CoffeeShop(protected val additives: Additives) { // 抽象動作 abstract fun makeCoffee() } ``` 4. **ConcreteImplementor 類**:實現抽象 `makeCoffee` 方法,**並且內部持有 `Additives` 抽象對象** ```java= class MyCoffeeShop constructor(additives: Additives) : CoffeeShop(additives) { override fun makeCoffee() { println("Make coffee done.") println(additives.addItem()) } } ``` * 測試橋接:透過注入不同的行為來達到相同物件來切換不同的行為,這也就代表了行為是可以單獨隔離出來維護、發展的 ```java= fun main() { // 加入 Milk 行為 // 達成了分離實作 & 行為 MyCoffeeShop(Milk()).makeCoffee() } ``` >  ## Android Source 視窗 1. 在 Android 源碼中也有使用到很多的橋接模式,尤其是 View 的部份:^1.^ **View 是對於視圖元件的「資料描述」**,而 ^2.^ **繪製的行為則交給「Canvas」負責** | Bridge 角色 | View 對應 | | - | - | | 資料 | TextView、Button... 等等 | | 實做(繪製) | Canvas | 2. 另一個更廣、更高層次的就是 Framework 層設計的「**視窗**」,其中會很明顯的涉及「應用」透過 IPC 通訊,將應用視窗交給「系統進程」管理 | Bridge 角色 | 視窗對應 | | - | - | | 資料 | Window,用來「提供標準的 UI 策略」,像是設定背景、標題、按鍵處理 | | 實做(通訊) | WindowManager,用來與「系統進程的視窗管理器」通訊 | :::success 以下使用 [**Android 10**](https://cs.android.com/android/platform/superproject/+/android-10.0.0_r40:) 作為分析目標 ::: ### 簡單認識應用中 [Window](https://cs.android.com/android/platform/superproject/+/android-10.0.0_r40:frameworks/base/core/java/android/view/Window.java) & [WindowManager](https://cs.android.com/android/platform/superproject/+/android-10.0.0_r40:frameworks/base/core/java/android/view/WindowManager.java) 的關係 > 這裡我們不會別去說明系統進程 WindowManagerService 的跨進程通訊 * 我們關注「**應用**」本身的「**視窗**」,看看它是如何體現 Bridge 設計的,本地應用視窗與 Bridge 設計對應的角色如下表 | Bridge 角色 | 應用視窗實現類 | 說明 | | - | - | - | | Abstraction(抽象) | [Window](https://cs.android.com/android/platform/superproject/+/android-10.0.0_r40:frameworks/base/core/java/android/view/Window.java) | 定義出該角色的抽象實現,同時內部保存了一個 Implementor 對象 | | Implementor(大部份是抽象、接口) | [PhoneWindow](https://cs.android.com/android/platform/superproject/+/android-10.0.0_r40:frameworks/base/core/java/com/android/internal/policy/PhoneWindow.java) | 抽象行為 | | RefinedAbstraction | [WindowManager](https://cs.android.com/android/platform/superproject/+/android-10.0.0_r40:frameworks/base/core/java/android/view/WindowManager.java) | 實現 Abstraction | | ConcreteImplementor | [WindowManagerImpl](https://cs.android.com/android/platform/superproject/+/android-10.0.0_r40:frameworks/base/core/java/android/view/WindowManagerImpl.java) | 實現 Implementor 行為 | 這裡我們簡單的說明一下本地應用視窗關係的關係 1. **構成視窗**:Window 定義抽象 UI 策略、PhoneWindoe 為具體的應用端實現、拓展 2. **顯示視窗**:WindowManager 定義抽象添加與顯示視窗的行為、WindowManagerImpl 則是實現與系統進程 IPC 通訊,達到真正的顯示視窗 ```mermaid classDiagram class Window{ <<abstract>> } class PhoneWindow class WindowManager{ <<abstract>> } class WindowManagerImpl PhoneWindow --|> Window WindowManagerImpl --|> WindowManager WindowManager <--o Window ``` ## 更多的物件導向設計 物件導向的設計基礎如下,如果是初學者或是不熟悉的各位,建議可以從這些基礎開始認識,打好基底才能走個更穩(在學習的時候也需要不斷回頭看)! :::info * [**設計建模 2 大概念- UML 分類、使用**](https://devtechascendancy.com/introduction-to-uml-and-diagrams/) * [**物件導向設計原則 – 6 大原則(一)**](https://devtechascendancy.com/object-oriented-design-principles_1/) * [**物件導向設計原則 – 6 大原則(二)**](https://devtechascendancy.com/object-oriented-design-principles_2/) ::: ### 創建模式 - Creation Patterns * [**創建模式 PK**](https://devtechascendancy.com/pk-design-patterns-factory-builder-best/) * **創建模式 - `Creation Patterns`**: 創建模式用於「**物件的創建**」,它關注於如何更靈活、更有效地創建對象。這些模式可以隱藏創建對象的細節,並提供創建對象的機制,例如單例模式、工廠模式… 等等,詳細解說請點擊以下連結 :::success * [**Singleton 單例模式 | 解說實現 | Android Framework Context Service**](https://devtechascendancy.com/object-oriented_design_singleton/) * [**Abstract Factory 設計模式 | 實現解說 | Android MediaPlayer**](https://devtechascendancy.com/object-oriented_design_abstract-factory/) * [**Factory 工廠方法模式 | 解說實現 | Java 集合設計**](https://devtechascendancy.com/object-oriented_design_factory_framework/) * [**Builder 建構者模式 | 實現與解說 | Android Framwrok Dialog 視窗**](https://devtechascendancy.com/object-oriented_design_builder_dialog/) * [**Clone 原型模式 | 解說實現 | Android Framework Intent**](https://devtechascendancy.com/object-oriented_design_clone_framework/) * [**Object Pool 設計模式 | 實現與解說 | 利用 JVM**](https://devtechascendancy.com/object-oriented_design_object-pool/) * [**Flyweight 享元模式 | 實現與解說 | 物件導向設計**](https://devtechascendancy.com/object-oriented_design_flyweight/) ::: ### 行為模式 - Behavioral Patterns * [**行為模式 PK**](https://devtechascendancy.com/pk-design-patterns-cmd-strat-state-obs-chain/) * **行為模式 - `Behavioral Patterns`**: 行為模式關注物件之間的「**通信**」和「**職責分配**」。它們描述了一系列對象如何協作,以完成特定任務。這些模式專注於改進物件之間的通信,從而提高系統的靈活性。例如,策略模式、觀察者模式… 等等,詳細解說請點擊以下連結 :::warning * [**Stragety 策略模式 | 解說實現 | Android Framework 動畫**](https://devtechascendancy.com/object-oriented_design_stragety_framework/) * [**Interpreter 解譯器模式 | 解說實現 | Android Framework PackageManagerService**](https://devtechascendancy.com/object-oriented_design_interpreter_framework/) * [**Chain 責任鏈模式 | 解說實現 | Android Framework View 事件傳遞**](https://devtechascendancy.com/object-oriented_design_chain_framework/) * [**State 狀態模式 | 實現解說 | 物件導向設計**](https://devtechascendancy.com/object-oriented_design_state/) * [**Specification 規格模式 | 解說實現 | Query 語句實做**](https://devtechascendancy.com/object-oriented_design_specification-query/) * [**Command 命令、Servant 雇工模式 | 實現與解說 | 物件導向設計**](https://devtechascendancy.com/object-oriented_design_command_servant/) * [**Memo 備忘錄模式 | 實現與解說 | Android Framwrok Activity 保存**](https://devtechascendancy.com/object-oriented_design_memo_framework/) * [**Visitor 設計模式 | 實現與解說 | 物件導向設計**](https://devtechascendancy.com/object-oriented_design_visitor_dispatch/) * [**Template 設計模式 | 實現與解說 | 物件導向設計**](https://devtechascendancy.com/object-oriented_design_template/) * [**Mediator 模式設計 | 實現與解說 | 物件導向設計**](https://devtechascendancy.com/object-oriented_programming_mediator/) * [**Composite 組合模式 | 實現與解說 | 物件導向設計**](https://devtechascendancy.com/object-oriented_programming_composite/) ::: ### 結構模式 - Structural Patterns * [**結構模式 PK**](https://devtechascendancy.com/pk-design-patterns-proxy-decorate-adapter/) * **結構模式 - `Structural Patterns`**: 結構模式專注於「物件之間的組成」,以形成更大的結構。這些模式可以幫助你確保當系統進行擴展或修改時,不會破壞其整體結構。例如,外觀模式、代理模式… 等等,詳細解說請點擊以下連結 :::danger * [**Bridge 橋接模式 | 解說實現 | 物件導向設計**](https://devtechascendancy.com/object-oriented_design_bridge/) * [**Decorate 裝飾模式 | 解說實現 | 物件導向設計**](https://devtechascendancy.com/object-oriented_design_decorate/) * [**Proxy 代理模式 | 解說實現 | 分析動態代理**](https://devtechascendancy.com/object-oriented_design_proxy_dynamic-proxy/) * [**Iterator 迭代設計 | 解說實現 | 物件導向設計**](https://devtechascendancy.com/object-oriented_design_iterator/) * [**Facade 外觀、門面模式 | 解說實現 | 物件導向設計**](https://devtechascendancy.com/object-oriented_design_facade/) * [**Adapter 設計模式 | 解說實現 | 物件導向設計**](https://devtechascendancy.com/object-oriented_design_adapter/) ::: ## Appendix & FAQ :::info ::: ###### tags: `Java 設計模式` `基礎進階`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up