摘要:橋接模式中的所謂脫耦,就是指在一個軟件系統的抽象化和實現化之間使用關聯關系組合或者聚合關系而不是繼承關系,從而使兩者可以相對獨立地變化,這就是橋接模式的用意。
0x01.定義與類型
定義:將抽象部分與它的具體實現部分分離,使它們都可以獨立地變化。
橋接模式將繼承關系轉化成關聯關系,它降低了類與類之間的耦合度,減少了系統中類的數量,也減少了代碼量。
橋接模式中的所謂脫耦,就是指在一個軟件系統的抽象化和實現化之間使用關聯關系(組合或者聚合關系)而不是繼承關系,從而使兩者可以相對獨立地變化,這就是橋接模式的用意。
類型:結構型
UML類圖
Java實現
/** * 主類抽象類 */ public abstract class Abstraction { /** * 橋接組合對象 */ protected Implementor implementor; public Abstraction(Implementor implementor) { this.implementor = implementor; } /** * 操作類 */ public abstract void operation(); } /** * 抽象接口 */ public interface Implementor { void operationImpl(); } /** * 實現類 */ public class RefinedAbstraction extends Abstraction { public RefinedAbstraction (Implementor implementor) { super(implementor); } @Override public void operation() { System.out.println("操作"); implementor.operationImpl(); } } /** * 接口抽象實現1 */ public class ConcreteImplementorA implements Implementor { @Override public void operationImpl() { System.out.println("橋接A"); } } /** * 接口抽象實現2 */ public class ConcreteImplementorB implements Implementor { @Override public void operationImpl() { System.out.println("橋接B"); } }
測試與應用
/** * 測試與應用 */ public class Test { public static void main(String[] args) { Abstraction abstraction1 = new RefinedAbstraction(new ConcreteImplementorA()); Abstraction abstraction2 = new RefinedAbstraction(new ConcreteImplementorB()); abstraction1.operation(); abstraction2.operation(); } }
輸出結果
操作 橋接A 操作 橋接B
角色介紹
Abstraction:抽象類,定義其中一個維度,會組合實現類接口。
RefinedAbstraction:擴充抽象類,抽象類的派生類,是一個維度的具體實現。
Implementor:實現類接口,另一個維度的接口。
ConcreteImplementor:具體實現類,另一個維度的具體實現類。
0x02.適用場景如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯系,通過橋接模式可以使它們在抽象層建立一個關聯關系。
一個類存在兩個(或多個)獨立變化的維度,且這兩個(或多個)維度都需要獨立進行擴展。
對于那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用。
0x03.優點分離抽象部分及其具體實現部分,提高了比繼承更好的解決方案。
提高了系統的可擴展性,在兩個變化維度中任意擴展一個維度,都不需要修改原有系統。
實現細節對客戶透明,可以對用戶隱藏實現細節。
符合開閉原則
符合合成復用原則
0x04.缺點橋接模式的引入會增加系統的理解與設計難度,由于聚合關聯關系建立在抽象層,要求開發者針對抽象進行設計與編程。
橋接模式要求正確識別出系統中兩個獨立變化的維度,因此其使用范圍具有一定的局限性。
0x05.樣例實現銀行有農業銀行和工商銀行等等,而賬戶有活期賬戶和死期賬戶,兩個維度很適合使用橋接模式,下面為具體實現:
Java實現
/** * 銀行抽象類 */ public abstract class Bank { protected Account account; public Bank(Account account) { this.account = account; } /** * 不限制方法名,但因為委派所以起的一樣 * 不要自己都實現了,要盡量把行為委托給組合的類 * @return */ abstract Account openAccount(); } /** * 農業銀行實現類 */ public class ABCBank extends Bank { public ABCBank (Account account) { super(account); } @Override Account openAccount() { System.out.println("打開中國農業銀行賬號"); account.openAccount(); return account; } } /** * 工商銀行實現類 */ public class ICBCBank extends Bank { public ICBCBank(Account account) { super(account); } @Override Account openAccount() { System.out.println("打開中國工商銀行賬號"); account.openAccount(); return account; } } /** * 銀行賬號, 橋的實現接口 */ public interface Account { /** * 打開賬號 * @return */ Account openAccount(); /** * 查看賬號類型 */ void showAccountType(); } /** * 定期賬戶實現類 */ public class DepositAccount implements Account { @Override public DepositAccount openAccount() { System.out.println("打開定期賬號"); return new DepositAccount(); } @Override public void showAccountType() { System.out.println("這是定期賬號"); } } /** * 活期賬戶實現類 */ public class SavingAccount implements Account { @Override public SavingAccount openAccount() { System.out.println("打開活期賬號"); return new SavingAccount(); } @Override public void showAccountType() { System.out.println("這是活期賬號"); } }
測試與應用類
/** * 測試與應用 */ public class Test { public static void main(String[] args) { Bank icbcBank = new ICBCBank(new DepositAccount()); Account icbcAccount = icbcBank.openAccount(); icbcAccount.showAccountType(); Bank abcBank = new ABCBank(new SavingAccount()); Account abcAccount = abcBank.openAccount(); abcAccount.showAccountType(); } }
輸出結果
打開中國工商銀行賬號 打開定期賬號 這是定期賬號 打開中國農業銀行賬號 打開活期賬號 這是活期賬號
UML類圖
0x06.相關設計模式
橋接模式和組合模式
組合模式強調的部分和整體的組合
橋接模式是平行級別上類的組合
橋接模式和適配器模式
都是為了讓兩個東西配合工作
適配器模式是改變已有的接口讓其配合工作,把目的相似,接口不同的類適配起來。
橋接模式是分離抽象和具體實現,目的是分離,把類的抽象和具體實現分離開,在此基礎上把接口結合起來
0x07.源碼中的橋接模式jdbc: Driver
0x08.源碼地址設計模式之橋接模式: https://github.com/sigmako/design-pattern/tree/master/bridge
0x09.推薦閱讀與參考慕課網設計模式精講: https://coding.imooc.com/class/270.html
設計模式讀書筆記-----橋接模式: https://www.cnblogs.com/chenssy/p/3317866.html
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76249.html
摘要:橋接模式定義橋接模式定義抽象化角色它的主要職責是定義出該角色的行為,同時保存一個對實現化角色的引用,該角色一般是抽象類。這種優雅的實現數據庫切換方式就是利用了橋接模式。1、什么是橋接模式?Decouple an abstraction from its implementation so that the two can vary independently.橋接模式(Bridge Patt...
摘要:橋接模式的核心在于將抽象部分和它的實現部分分離,使它們都可以獨立的變化。看起來這個版本已經很完美了不,它仍然有可以優化的空間,即題目提到的橋接模式。使用橋接模式的實現版本這個實現包含了三個函數。這個例子體現了橋接模式的作用。 我寫的程序員面試系列文章 Java面試系列-webapp文件夾和WebContent文件夾的區別? 程序員面試系列:Spring MVC能響應HTTP請求的原因?...
摘要:橋接模式之特權函數特權函數,用一些具有特權的方法作為橋梁以便訪問私有空間,可以回憶一下之前的系列。連續自然數分組,計算最多組的個數將至這個連續自然數分成組使每組相加的值相等。個數組中數字最多的一組有個此時的和為。 本回內容介紹 上一回,聊了適配器模式,圖片預加載,介一回,聊橋接模式(Bridge),跟之前一樣,難度比較小,橋接模式將抽象部分與它的實現部分分離,通過橋接模式聯系彼此,同時...
閱讀 2250·2021-11-16 11:44
閱讀 644·2019-08-30 15:55
閱讀 3277·2019-08-30 15:52
閱讀 3614·2019-08-30 15:43
閱讀 2201·2019-08-30 11:21
閱讀 439·2019-08-29 12:18
閱讀 1951·2019-08-26 18:15
閱讀 473·2019-08-26 10:32