將實現與抽象放在兩個不同的層次中,使兩個層次可以獨立改變。
橋接模式基於類的最小設計原則,通過使用封裝、聚合、繼承等行為讓不同的類承擔不同的職責。
它的主要特點是把抽象與行為實現分離開,從而可以保持各部分的獨立性以及功能擴充套件。
其中,abstraction為抽象化角色,定義出該角色的行為,同時儲存乙個對實現化角色的引用;implementor是實現化角色,它是介面或者抽象類,定義角色必需的行為和屬性;refinedabstraction為修正抽象化角色,引用實現化角色對抽象化角色進行修正;concreteimplementor為具體實現化角色,實現介面或抽象類定義的方法或屬性。
橋接模式分離了抽象部分和實現部分,從而極大的提供了系統的靈活性,讓抽象部分和實現部分獨立開來,分別定義介面,這有助於系統進行分層設計,從而產生更好的結構化系統。對於系統的高層部分,只需要知道抽象部分和實現部分的介面就可以了。
由於橋接模式把抽象部分和實現部分分離了,從而分別定義介面,這就使得抽象部分和實現部分可以分別獨立擴充套件,而不會相互影響,大大的提供了系統的可擴充套件性。
由於橋接模式實現了抽象和實現的分離,所以在實現橋接模式時,就可以實現動態的選擇和使用具體的實現。
(1)橋接模式的引入增加了系統的理解和設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計和程式設計。
(2)橋接模式要求正確識別出系統中兩個獨立變化的維度,因此其使用範圍有一定的侷限性。
應用例項:
(1)開關。我們可以看到的開關是抽象的,不用管裡面具體怎麼實現;
(2)手機品牌與手機軟體。兩者間有一條聚合線,乙個手機品牌可以有多個手機軟體。
不要一涉及繼承就考慮該模式,盡可能把變化的因素封裝到最細、最小的邏輯單元中,避免風險擴散。
當發現類的繼承有n層時,可以考慮使用該模式。
使用jcbc的時候,一直很困惑獲取connection的過程和原理,為什麼把不同的資料庫驅動名稱放到class.forname()中就能獲取到對應的資料庫連線呢?
oracle為例,通過class.forname("oracle.jdbc.oracledriver")類載入的時候執行靜態**塊將driver註冊到drivermanager,drivermanager是個driver容器,管理不同的driver,這樣具體的資料driver實現就統一交給容器管理,客戶端通過drivermanager執行驗證連線,獲取連線的操作。
Junit原始碼分析 設計模式
junit的底層 主要是由觀察者模式,組合模式,模板模式,命令模式 來實現的。在junit裡首先會初始化乙個主題物件testresult物件,這個物件裡面有增加 的方法,所有的 方法都實現了 testlistener介面,這個介面會把一系統測試過程的資訊傳遞給所有的 然後 會按照它們的方式顯示給用 ...
Android原始碼設計模式分析專案
該系列文章已經根據技術發展 實戰需求以及讀者您的反饋重寫所有章節,並且加入更加深入的核心機制分析以及模式在android開發中的實戰,以便幫助大家更系統的學習。書籍已經出版,購買位址在為 android原始碼設計模式解析與實戰 另外,我們的聯絡郵箱為 coder.h gmail.com,謝謝。設計模...
JQuery設計模式之原始碼分析 三
callbacks作用 callbacks用於管理函式佇列。callbacks的使用 我們通過呼叫 callbacks options 獲取到乙個callbacks例項 內部api分別有 add 向內部佇列新增函式 fire依次執行佇列裡的函式 構造引數分別有 stoponfalse 內部佇列裡的函...