摘要:橋接模式中的所謂脫耦,就是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用關(guān)聯(lián)關(guān)系組合或者聚合關(guān)系而不是繼承關(guān)系,從而使兩者可以相對(duì)獨(dú)立地變化,這就是橋接模式的用意。
0x01.定義與類型
定義:將抽象部分與它的具體實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。
橋接模式將繼承關(guān)系轉(zhuǎn)化成關(guān)聯(lián)關(guān)系,它降低了類與類之間的耦合度,減少了系統(tǒng)中類的數(shù)量,也減少了代碼量。
橋接模式中的所謂脫耦,就是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用關(guān)聯(lián)關(guān)系(組合或者聚合關(guān)系)而不是繼承關(guān)系,從而使兩者可以相對(duì)獨(dú)立地變化,這就是橋接模式的用意。
類型:結(jié)構(gòu)型
UML類圖
Java實(shí)現(xiàn)
/** * 主類抽象類 */ public abstract class Abstraction { /** * 橋接組合對(duì)象 */ protected Implementor implementor; public Abstraction(Implementor implementor) { this.implementor = implementor; } /** * 操作類 */ public abstract void operation(); } /** * 抽象接口 */ public interface Implementor { void operationImpl(); } /** * 實(shí)現(xiàn)類 */ public class RefinedAbstraction extends Abstraction { public RefinedAbstraction (Implementor implementor) { super(implementor); } @Override public void operation() { System.out.println("操作"); implementor.operationImpl(); } } /** * 接口抽象實(shí)現(xiàn)1 */ public class ConcreteImplementorA implements Implementor { @Override public void operationImpl() { System.out.println("橋接A"); } } /** * 接口抽象實(shí)現(xiàn)2 */ public class ConcreteImplementorB implements Implementor { @Override public void operationImpl() { System.out.println("橋接B"); } }
測(cè)試與應(yīng)用
/** * 測(cè)試與應(yīng)用 */ 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(); } }
輸出結(jié)果
操作 橋接A 操作 橋接B
角色介紹
Abstraction:抽象類,定義其中一個(gè)維度,會(huì)組合實(shí)現(xiàn)類接口。
RefinedAbstraction:擴(kuò)充抽象類,抽象類的派生類,是一個(gè)維度的具體實(shí)現(xiàn)。
Implementor:實(shí)現(xiàn)類接口,另一個(gè)維度的接口。
ConcreteImplementor:具體實(shí)現(xiàn)類,另一個(gè)維度的具體實(shí)現(xiàn)類。
0x02.適用場(chǎng)景如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個(gè)層次之間建立靜態(tài)的繼承聯(lián)系,通過橋接模式可以使它們?cè)诔橄髮咏⒁粋€(gè)關(guān)聯(lián)關(guān)系。
一個(gè)類存在兩個(gè)(或多個(gè))獨(dú)立變化的維度,且這兩個(gè)(或多個(gè))維度都需要獨(dú)立進(jìn)行擴(kuò)展。
對(duì)于那些不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類的個(gè)數(shù)急劇增加的系統(tǒng),橋接模式尤為適用。
0x03.優(yōu)點(diǎn)分離抽象部分及其具體實(shí)現(xiàn)部分,提高了比繼承更好的解決方案。
提高了系統(tǒng)的可擴(kuò)展性,在兩個(gè)變化維度中任意擴(kuò)展一個(gè)維度,都不需要修改原有系統(tǒng)。
實(shí)現(xiàn)細(xì)節(jié)對(duì)客戶透明,可以對(duì)用戶隱藏實(shí)現(xiàn)細(xì)節(jié)。
符合開閉原則
符合合成復(fù)用原則
0x04.缺點(diǎn)橋接模式的引入會(huì)增加系統(tǒng)的理解與設(shè)計(jì)難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對(duì)抽象進(jìn)行設(shè)計(jì)與編程。
橋接模式要求正確識(shí)別出系統(tǒng)中兩個(gè)獨(dú)立變化的維度,因此其使用范圍具有一定的局限性。
0x05.樣例實(shí)現(xiàn)銀行有農(nóng)業(yè)銀行和工商銀行等等,而賬戶有活期賬戶和死期賬戶,兩個(gè)維度很適合使用橋接模式,下面為具體實(shí)現(xiàn):
Java實(shí)現(xiàn)
/** * 銀行抽象類 */ public abstract class Bank { protected Account account; public Bank(Account account) { this.account = account; } /** * 不限制方法名,但因?yàn)槲伤云鸬囊粯? * 不要自己都實(shí)現(xiàn)了,要盡量把行為委托給組合的類 * @return */ abstract Account openAccount(); } /** * 農(nóng)業(yè)銀行實(shí)現(xiàn)類 */ public class ABCBank extends Bank { public ABCBank (Account account) { super(account); } @Override Account openAccount() { System.out.println("打開中國(guó)農(nóng)業(yè)銀行賬號(hào)"); account.openAccount(); return account; } } /** * 工商銀行實(shí)現(xiàn)類 */ public class ICBCBank extends Bank { public ICBCBank(Account account) { super(account); } @Override Account openAccount() { System.out.println("打開中國(guó)工商銀行賬號(hào)"); account.openAccount(); return account; } } /** * 銀行賬號(hào), 橋的實(shí)現(xiàn)接口 */ public interface Account { /** * 打開賬號(hào) * @return */ Account openAccount(); /** * 查看賬號(hào)類型 */ void showAccountType(); } /** * 定期賬戶實(shí)現(xiàn)類 */ public class DepositAccount implements Account { @Override public DepositAccount openAccount() { System.out.println("打開定期賬號(hào)"); return new DepositAccount(); } @Override public void showAccountType() { System.out.println("這是定期賬號(hào)"); } } /** * 活期賬戶實(shí)現(xiàn)類 */ public class SavingAccount implements Account { @Override public SavingAccount openAccount() { System.out.println("打開活期賬號(hào)"); return new SavingAccount(); } @Override public void showAccountType() { System.out.println("這是活期賬號(hào)"); } }
測(cè)試與應(yīng)用類
/** * 測(cè)試與應(yīng)用 */ 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(); } }
輸出結(jié)果
打開中國(guó)工商銀行賬號(hào) 打開定期賬號(hào) 這是定期賬號(hào) 打開中國(guó)農(nóng)業(yè)銀行賬號(hào) 打開活期賬號(hào) 這是活期賬號(hào)
UML類圖
0x06.相關(guān)設(shè)計(jì)模式
橋接模式和組合模式
組合模式強(qiáng)調(diào)的部分和整體的組合
橋接模式是平行級(jí)別上類的組合
橋接模式和適配器模式
都是為了讓兩個(gè)東西配合工作
適配器模式是改變已有的接口讓其配合工作,把目的相似,接口不同的類適配起來。
橋接模式是分離抽象和具體實(shí)現(xiàn),目的是分離,把類的抽象和具體實(shí)現(xiàn)分離開,在此基礎(chǔ)上把接口結(jié)合起來
0x07.源碼中的橋接模式jdbc: Driver
0x08.源碼地址設(shè)計(jì)模式之橋接模式: https://github.com/sigmako/design-pattern/tree/master/bridge
0x09.推薦閱讀與參考慕課網(wǎng)設(shè)計(jì)模式精講: https://coding.imooc.com/class/270.html
設(shè)計(jì)模式讀書筆記-----橋接模式: https://www.cnblogs.com/chenssy/p/3317866.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76249.html
摘要:橋接模式定義橋接模式定義抽象化角色它的主要職責(zé)是定義出該角色的行為,同時(shí)保存一個(gè)對(duì)實(shí)現(xiàn)化角色的引用,該角色一般是抽象類。這種優(yōu)雅的實(shí)現(xiàn)數(shù)據(jù)庫(kù)切換方式就是利用了橋接模式。1、什么是橋接模式?Decouple an abstraction from its implementation so that the two can vary independently.橋接模式(Bridge Patt...
摘要:橋接模式的核心在于將抽象部分和它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。看起來這個(gè)版本已經(jīng)很完美了不,它仍然有可以優(yōu)化的空間,即題目提到的橋接模式。使用橋接模式的實(shí)現(xiàn)版本這個(gè)實(shí)現(xiàn)包含了三個(gè)函數(shù)。這個(gè)例子體現(xiàn)了橋接模式的作用。 我寫的程序員面試系列文章 Java面試系列-webapp文件夾和WebContent文件夾的區(qū)別? 程序員面試系列:Spring MVC能響應(yīng)HTTP請(qǐng)求的原因?...
摘要:橋接模式之特權(quán)函數(shù)特權(quán)函數(shù),用一些具有特權(quán)的方法作為橋梁以便訪問私有空間,可以回憶一下之前的系列。連續(xù)自然數(shù)分組,計(jì)算最多組的個(gè)數(shù)將至這個(gè)連續(xù)自然數(shù)分成組使每組相加的值相等。個(gè)數(shù)組中數(shù)字最多的一組有個(gè)此時(shí)的和為。 本回內(nèi)容介紹 上一回,聊了適配器模式,圖片預(yù)加載,介一回,聊橋接模式(Bridge),跟之前一樣,難度比較小,橋接模式將抽象部分與它的實(shí)現(xiàn)部分分離,通過橋接模式聯(lián)系彼此,同時(shí)...
摘要:簡(jiǎn)介橋接模式將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。同時(shí)橋接模式也有自己的缺點(diǎn)大量的類將導(dǎo)致開發(fā)成本的增加,同時(shí)在性能方面可能也會(huì)有所減少。 1. 簡(jiǎn)介 橋接模式(Bridge)將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。其實(shí)就是函數(shù)的封裝,比如要對(duì)某個(gè)DOM元素添加color和backgroundColor,可以封裝個(gè)changeColor函數(shù),這樣可以在多個(gè)...
摘要:分別為適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。設(shè)計(jì)模式五適配器模式適配器模式將某個(gè)對(duì)象的接生成器和協(xié)程的實(shí)現(xiàn)在這篇文章中,作者針對(duì)那些比較難以理解的概念,以一個(gè)更為通俗的方式去講明白。。 PHP 源碼注解 PHP 的詳細(xì)源碼注解 PHP 字符串操作整理 一些有關(guān)字符串的常用操作。 Redis 常見七種使用場(chǎng)景 (PHP 實(shí)戰(zhàn)) 這篇文章主要介紹利用 R...
閱讀 2323·2021-11-16 11:44
閱讀 668·2019-08-30 15:55
閱讀 3303·2019-08-30 15:52
閱讀 3646·2019-08-30 15:43
閱讀 2226·2019-08-30 11:21
閱讀 463·2019-08-29 12:18
閱讀 1985·2019-08-26 18:15
閱讀 502·2019-08-26 10:32