Java橋梁設(shè)計模式優(yōu)雅地將抽象與實現(xiàn)分離
介紹
Java橋梁模式(也稱橋接模式)(Bridge Pattern)是一種設(shè)計模式,它將抽象和實現(xiàn)分離,使它們可以獨立地變化.它通過一個大類或者一系列緊密關(guān)聯(lián)的類拆分成兩個獨立的層次結(jié)構(gòu)來實現(xiàn)這種分離,其中一個層次結(jié)構(gòu)包含抽象類或接口,另一個層次結(jié)構(gòu)包含實現(xiàn)類.橋梁模式使得抽象類和實現(xiàn)類可以獨立地變化,從而實現(xiàn)了松耦合.
在Java中,橋梁模式通常使用接口來定義抽象部分,使用抽象類來實現(xiàn)部分實現(xiàn),并將它們通過組合的方式組合起來.抽象部分包含一個只想實現(xiàn)部分的引用,實現(xiàn)部分實現(xiàn)了抽象部分定義的接口.
Java橋梁模式分為以下四種角色:
- 抽象化角色(Abstraction):定義抽象化的接口,維護(hù)一個指向?qū)崿F(xiàn)化對象的引用.
- 擴(kuò)展抽象化角色(Refined Abstraction):擴(kuò)展抽象化角色,通常是抽象化角色的子類,實現(xiàn)抽象化角色中的業(yè)務(wù)方法.
- 實現(xiàn)化角色(Implementor):定義實現(xiàn)化角色的接口,這個接口不一定要與抽象化角色的接口完全一致,事實上,這兩個接口可以完全不同.
- 具體實現(xiàn)化角色(Concrete Implementor):具體實現(xiàn)化角色實現(xiàn)實現(xiàn)化角色接口,并完成具體的業(yè)務(wù)邏輯.
實現(xiàn)
例如,在電商網(wǎng)站中,可能需要支持多種支持方式,如支付寶,微信支付和銀聯(lián)支付等.使用橋梁模式可以輕松地添加或切換不同的支付方式,以滿足用戶的需求.
實現(xiàn)化角色
public interface PaymentImplementor {
/**
* 支付
*
* @param amount
*/
void processPayment(double amount);
}
具體實現(xiàn)化角色
public class AliPaymentImplementor implements PaymentImplementor {
/**
* 支付
*
* @param amount
*/
@Override
public void processPayment(double amount) {
System.out.println("支付寶支付:" + amount + "元...");
}
}
public class WechatPaymentImplementor implements PaymentImplementor {
/**
* 支付
*
* @param amount
*/
@Override
public void processPayment(double amount) {
System.out.println("微信支付:" + amount + "元...");
}
}
public class UnionpayPaymentImplementor implements PaymentImplementor {
/**
* 支付
*
* @param amount
*/
@Override
public 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
*/
@Override
public void pay(double amount) {
System.out.println("開始在線支付...");
implementor.processPayment(amount);
System.out.println("在線支付完成...");
}
}
測試
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);
}
}

這段代碼是一個簡單的實現(xiàn)了橋梁模式的示例.其中,Payment是抽象類,OnlinePayment是其子類,PaymentImplementor是接口,AliPaymentImplementor,UnionpayPaymentImplementor和WechatPaymentImplementor都是其實現(xiàn)類.通過這種方式,Payment類PayImplementor接口被解耦,可以獨立地發(fā)展和擴(kuò)展.
在這個示例中,Payment類是抽象化,不能被實例化,而是通過OnlinePayment子類進(jìn)行實例化.OnlinePayment子類重寫了pay方法,并調(diào)用implementor.processPayment方法,該方法由實現(xiàn)PaymentImplementor接口的類來是心啊,例如,AliPaymentImplementor,UnionpayPaymentImplementor和WechatPaymentImplementor.這種方式使得PaymentImplementor接口的實現(xiàn)類可以動態(tài)地注入到OnlinePayment類中,從而實現(xiàn)了不同的支付方式,而不需要修改OnlinePayment類.
總結(jié)
優(yōu)點
- 分離抽象和實現(xiàn)部分,使得它們可以獨立變化,從而增加了系統(tǒng)的靈活性和可擴(kuò)展性.
- 通過抽象接口來管理對象之間的關(guān)系,更加符合面向?qū)ο缶幊痰脑瓌t,使得系統(tǒng)更加易于維護(hù)和理解.
- 橋梁模式可以避免使用繼承造成的類爆炸問題,因為它似乎用了組合關(guān)系.
缺點
- 橋梁模式增加了系統(tǒng)的復(fù)雜性,需要額外的抽象層,可能會導(dǎo)致系統(tǒng)的設(shè)計變得復(fù)雜.
- 如果不恰當(dāng)?shù)卦O(shè)計橋梁接口和實現(xiàn)類,可能會導(dǎo)致系統(tǒng)的耦合度增加.
應(yīng)用場景
- 當(dāng)一個類具有多個變化維度(例如,一個形狀類有不同的顏色和尺寸)時,可以使用橋梁模式來將它們分離開來,從而使得系統(tǒng)更加靈活.
- 當(dāng)需要支持不同平臺,數(shù)據(jù)庫或協(xié)議時,可以使用橋梁模式來封裝這些實現(xiàn)細(xì)節(jié),使得客戶端和實現(xiàn)部分可以獨立變化,而不影響彼此.
- 當(dāng)需要運行時動態(tài)地切換實現(xiàn)時,可以使用橋梁模式來實現(xiàn)這種切換.
到此這篇關(guān)于Java橋梁設(shè)計模式優(yōu)雅地將抽象與實現(xiàn)分離的文章就介紹到這了,更多相關(guān)Java橋梁設(shè)計模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java過濾器doFilter里chain.doFilter()函數(shù)的理解
這篇文章主要介紹了Java過濾器doFilter里chain.doFilter()函數(shù)的理解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Java+swing實現(xiàn)經(jīng)典貪吃蛇游戲
貪吃蛇(也叫做貪食蛇)游戲是一款休閑益智類游戲,有PC和手機(jī)等多平臺版本。既簡單又耐玩。本文將通過java的swing來實現(xiàn)這一游戲,需要的可以參考一下2022-01-01

