建設(shè)網(wǎng)站前期準(zhǔn)備工作河南品牌網(wǎng)絡(luò)推廣外包
介紹
Java橋梁模式(也稱橋接模式)(Bridge Pattern)是一種設(shè)計(jì)模式,它將抽象和實(shí)現(xiàn)分離,使它們可以獨(dú)立地變化.它通過一個(gè)大類或者一系列緊密關(guān)聯(lián)的類拆分成兩個(gè)獨(dú)立的層次結(jié)構(gòu)來實(shí)現(xiàn)這種分離,其中一個(gè)層次結(jié)構(gòu)包含抽象類或接口,另一個(gè)層次結(jié)構(gòu)包含實(shí)現(xiàn)類.橋梁模式使得抽象類和實(shí)現(xiàn)類可以獨(dú)立地變化,從而實(shí)現(xiàn)了松耦合.
在Java中,橋梁模式通常使用接口來定義抽象部分,使用抽象類來實(shí)現(xiàn)部分實(shí)現(xiàn),并將它們通過組合的方式組合起來.抽象部分包含一個(gè)只想實(shí)現(xiàn)部分的引用,實(shí)現(xiàn)部分實(shí)現(xiàn)了抽象部分定義的接口.
Java橋梁模式分為以下四種角色:
- 抽象化角色(Abstraction):定義抽象化的接口,維護(hù)一個(gè)指向?qū)崿F(xiàn)化對(duì)象的引用.
- 擴(kuò)展抽象化角色(Refined Abstraction):擴(kuò)展抽象化角色,通常是抽象化角色的子類,實(shí)現(xiàn)抽象化角色中的業(yè)務(wù)方法.
- 實(shí)現(xiàn)化角色(Implementor):定義實(shí)現(xiàn)化角色的接口,這個(gè)接口不一定要與抽象化角色的接口完全一致,事實(shí)上,這兩個(gè)接口可以完全不同.
- 具體實(shí)現(xiàn)化角色(Concrete Implementor):具體實(shí)現(xiàn)化角色實(shí)現(xiàn)實(shí)現(xiàn)化角色接口,并完成具體的業(yè)務(wù)邏輯.
實(shí)現(xiàn)
例如,在電商網(wǎng)站中,可能需要支持多種支持方式,如支付寶,微信支付和銀聯(lián)支付等.使用橋梁模式可以輕松地添加或切換不同的支付方式,以滿足用戶的需求.
實(shí)現(xiàn)化角色
public interface PaymentImplementor {/*** 支付** @param amount*/void processPayment(double amount);
}
具體實(shí)現(xiàn)化角色
public class AliPaymentImplementor implements PaymentImplementor {/*** 支付** @param amount*/@Overridepublic void processPayment(double amount) {System.out.println("支付寶支付:" + amount + "元...");}
}public class WechatPaymentImplementor implements PaymentImplementor {/*** 支付** @param amount*/@Overridepublic void processPayment(double amount) {System.out.println("微信支付:" + amount + "元...");}
}public class UnionpayPaymentImplementor implements PaymentImplementor {/*** 支付** @param amount*/@Overridepublic void processPayment(double amount) {System.out.println("銀聯(lián)支付:" + amount + "元...");}
}
抽象化角色
public abstract class Payment {protected PaymentImplementor implementor;public Payment(PaymentImplementor implementor) {this.implementor = implementor;}/*** 支付** @param amount*/public abstract void pay(double amount);
}
擴(kuò)展化抽象角色
public class OnlinePayment extends Payment{public OnlinePayment(PaymentImplementor implementor) {super(implementor);}/*** 支付** @param amount*/@Overridepublic void pay(double amount) {System.out.println("開始在線支付...");implementor.processPayment(amount);System.out.println("在線支付完成...");}
}
測(cè)試
public class Demo {public static void main(String[] args) {// 支付寶支付PaymentImplementor paymentImplementor = new AliPaymentImplementor();Payment payment = new OnlinePayment(paymentImplementor);payment.pay(100);System.out.println();// 微信支付paymentImplementor = new WechatPaymentImplementor();payment = new OnlinePayment(paymentImplementor);payment.pay(101);System.out.println();// 銀聯(lián)支付paymentImplementor = new UnionpayPaymentImplementor();payment = new OnlinePayment(paymentImplementor);payment.pay(102);}
}
這段代碼是一個(gè)簡(jiǎn)單的實(shí)現(xiàn)了橋梁模式的示例.其中,Payment是抽象類,OnlinePayment是其子類,PaymentImplementor是接口,AliPaymentImplementor,UnionpayPaymentImplementor和WechatPaymentImplementor都是其實(shí)現(xiàn)類.通過這種方式,Payment類PayImplementor接口被解耦,可以獨(dú)立地發(fā)展和擴(kuò)展.
在這個(gè)示例中,Payment類是抽象化,不能被實(shí)例化,而是通過OnlinePayment子類進(jìn)行實(shí)例化.OnlinePayment子類重寫了pay方法,并調(diào)用implementor.processPayment方法,該方法由實(shí)現(xiàn)PaymentImplementor接口的類來是心啊,例如,AliPaymentImplementor,UnionpayPaymentImplementor和WechatPaymentImplementor.這種方式使得PaymentImplementor接口的實(shí)現(xiàn)類可以動(dòng)態(tài)地注入到OnlinePayment類中,從而實(shí)現(xiàn)了不同的支付方式,而不需要修改OnlinePayment類.
總結(jié)
優(yōu)點(diǎn)
- 分離抽象和實(shí)現(xiàn)部分,使得它們可以獨(dú)立變化,從而增加了系統(tǒng)的靈活性和可擴(kuò)展性.
- 通過抽象接口來管理對(duì)象之間的關(guān)系,更加符合面向?qū)ο缶幊痰脑瓌t,使得系統(tǒng)更加易于維護(hù)和理解.
- 橋梁模式可以避免使用繼承造成的類爆炸問題,因?yàn)樗坪跤昧私M合關(guān)系.
缺點(diǎn)
- 橋梁模式增加了系統(tǒng)的復(fù)雜性,需要額外的抽象層,可能會(huì)導(dǎo)致系統(tǒng)的設(shè)計(jì)變得復(fù)雜.
- 如果不恰當(dāng)?shù)卦O(shè)計(jì)橋梁接口和實(shí)現(xiàn)類,可能會(huì)導(dǎo)致系統(tǒng)的耦合度增加.
應(yīng)用場(chǎng)景
- 當(dāng)一個(gè)類具有多個(gè)變化維度(例如,一個(gè)形狀類有不同的顏色和尺寸)時(shí),可以使用橋梁模式來將它們分離開來,從而使得系統(tǒng)更加靈活.
- 當(dāng)需要支持不同平臺(tái),數(shù)據(jù)庫或協(xié)議時(shí),可以使用橋梁模式來封裝這些實(shí)現(xiàn)細(xì)節(jié),使得客戶端和實(shí)現(xiàn)部分可以獨(dú)立變化,而不影響彼此.
- 當(dāng)需要運(yùn)行時(shí)動(dòng)態(tài)地切換實(shí)現(xiàn)時(shí),可以使用橋梁模式來實(shí)現(xiàn)這種切換.