首頁  >  文章  >  Java  >  怎麼使用Java橋樑設計模式優雅地將抽象與實作分離

怎麼使用Java橋樑設計模式優雅地將抽象與實作分離

王林
王林轉載
2023-05-24 18:16:16959瀏覽

介紹

Java橋樑模式(也稱橋接模式)(Bridge Pattern)是一種設計模式,它將抽象和實現分離,使它們可以獨立地變化.它通過一個大類或者一系列緊密關聯的類別拆分成兩個獨立的層次結構來實現這種分離,其中一個層次結構包含抽象類別或介面,另一個層次結構包含實現類別.橋樑模式使得抽象類別和實現類別可以獨立地變化,從而實現了鬆散耦合.

在Java中,橋樑模式通常使用介面來定義抽象部分,使用抽象類別來實現部分實現,並將它們透過組合的方式組合起來.抽象部分包含一個只想實作部分的參考,實作部分實作了抽象部分定義的介面.

Java橋樑模式分為以下四種角色:

  • 抽象角色(Abstraction) :定義抽象化的介面,維護一個指向實現化物件的參考.

  • 擴展抽象化角色(Refined Abstraction):擴展抽象化角色,通常是抽象角色的子類,實作抽象角色中的業務方法.

  • 實現化角色(Implementor):定義實現化角色的介面,這個介面不一定要與抽象化角色的介面完全一致,事實上,這兩個介面可以完全不同.

  • 具體實現化角色(Concrete Implementor):具體實現化角色實現實現化角色介面,並完成具體的業務邏輯.

實現

例如,在電商網站中,可能需要支援多種支援方式,如支付寶,微信支付和銀聯支付等.使用橋樑模式可以輕鬆地新增或切換不同的支付方式,以滿足使用者的需求.

實現化角色

public interface PaymentImplementor {
    /**
     * 支付
     *
     * @param amount
     */
    void processPayment(double amount);
}

具體實現化角色

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("银联支付:" + amount + "元...");
    }
}

抽象化角色

public abstract class Payment {
    protected PaymentImplementor implementor;
    public Payment(PaymentImplementor implementor) {
        this.implementor = implementor;
    }
    /**
     * 支付
     *
     * @param amount
     */
    public abstract void pay(double amount);
}

擴展抽象角色

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();
        // 银联支付
        paymentImplementor = new UnionpayPaymentImplementor();
        payment = new OnlinePayment(paymentImplementor);
        payment.pay(102);
    }
}

怎麼使用Java橋樑設計模式優雅地將抽象與實作分離

#這段程式碼是一個簡單的實現了橋樑模式的範例.其中,Payment是抽象類別, OnlinePayment是其子類別,PaymentImplementor是介面,AliPaymentImplementor,UnionpayPaymentImplementor和WechatPaymentImplementor都是其實作類別.透過這種方式,Payment類別PayImplementor介面被解耦,可以獨立地發展和擴展.

##在這個範例類別PayImplementor介面被解耦,可以獨立地發展和擴展.

##在這個範例類別PayImplementor介面被解耦,可以獨立地發展和擴展.

##在這個範例類別PayImplementor介面中,Payment類別是抽象化,不能被實例化,而是透過OnlinePayment子類別進行實例化.OnlinePayment子類別重寫了pay方法,並呼叫implementor.processPayment方法,該方法由實作PaymentImplementor介面的類別來是心啊,例如,AliPaymentImplementor,UnionpayPaymentImplementor和WechatPaymentImplementor.這種方式使得PaymentImplementor接口的實現類可以動態地註入到OnlinePayment類中,從而實現了不同的支付方式,而不需要修改OnlinePayment類.

##總結

優點

  • 分離抽象和實作部分,使得它們可以獨立變化,從而增加了系統的靈活性和可擴展性.

  • #透過抽象介面來管理物件之間的關係,更符合物件導向程式設計的原則,使得系統更加易於維護和理解.

  • 橋樑模式可以避免使用繼承造成的類別爆炸問題,因為它似乎用了組合關係.

缺點

  • 橋樑模式增加了系統的複雜性,需要額外的抽象層,可能會導致系統的設計變得複雜.

  • 如果不恰當地設計橋樑介面和實作類別,可能會導致系統的耦合度增加.

應用場景

  • 當一個類別具有多個變化維度(例如,一個形狀類別有不同的顏色和尺寸)時,可以使用橋樑模式來將它們分開,從而使得系統更加靈活.

  • 當需要支援不同平台,資料庫或協定時,可以使用橋樑模式來封裝這些實作細節,使得客戶端和實現部分可以獨立變化,而不影響彼此.

  • 當需要運行時動態地切換實現時,可以使用橋樑模式來實現這種切換.

以上是怎麼使用Java橋樑設計模式優雅地將抽象與實作分離的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除