首頁 > 軟體

Java橋樑設計模式優雅地將抽象與實現分離

2023-09-05 18:04:59

介紹

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);
    }
}

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

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

總結

優點

  • 分離抽象和實現部分,使得它們可以獨立變化,從而增加了系統的靈活性和可延伸性.
  • 通過抽象介面來管理物件之間的關係,更加符合物件導向程式設計的原則,使得系統更加易於維護和理解.
  • 橋樑模式可以避免使用繼承造成的類爆炸問題,因為它似乎用了組合關係.

缺點

  • 橋樑模式增加了系統的複雜性,需要額外的抽象層,可能會導致系統的設計變得複雜.
  • 如果不恰當地設計橋樑介面和實現類,可能會導致系統的耦合度增加.

應用場景

  • 當一個類具有多個變化維度(例如,一個形狀類有不同的顏色和尺寸)時,可以使用橋樑模式來將它們分離開來,從而使得系統更加靈活.
  • 當需要支援不同平臺,資料庫或協定時,可以使用橋樑模式來封裝這些實現細節,使得使用者端和實現部分可以獨立變化,而不影響彼此.
  • 當需要執行時動態地切換實現時,可以使用橋樑模式來實現這種切換.

到此這篇關於Java橋樑設計模式優雅地將抽象與實現分離的文章就介紹到這了,更多相關Java橋樑設計模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com