最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java橋梁設(shè)計(jì)模式優(yōu)雅地將抽象與實(shí)現(xiàn)分離

 更新時(shí)間:2023年04月22日 08:39:15   作者:.番茄炒蛋  
Java橋接設(shè)計(jì)模式通過將抽象和實(shí)現(xiàn)分離,使得它們可以獨(dú)立地變化,從而實(shí)現(xiàn)更靈活的代碼結(jié)構(gòu)。它是一種優(yōu)雅的設(shè)計(jì)模式,適用于需要處理多個(gè)變化因素的復(fù)雜應(yīng)用程序

介紹

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)化對象的引用.
  • 擴(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
     */
    @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);
    }
}

這段代碼是一個(gè)簡單的實(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)類可以動態(tài)地注入到OnlinePayment類中,從而實(shí)現(xiàn)了不同的支付方式,而不需要修改OnlinePayment類.

總結(jié)

優(yōu)點(diǎn)

  • 分離抽象和實(shí)現(xiàn)部分,使得它們可以獨(dú)立變化,從而增加了系統(tǒng)的靈活性和可擴(kuò)展性.
  • 通過抽象接口來管理對象之間的關(guān)系,更加符合面向?qū)ο缶幊痰脑瓌t,使得系統(tǒng)更加易于維護(hù)和理解.
  • 橋梁模式可以避免使用繼承造成的類爆炸問題,因?yàn)樗坪跤昧私M合關(guān)系.

缺點(diǎn)

  • 橋梁模式增加了系統(tǒng)的復(fù)雜性,需要額外的抽象層,可能會導(dǎo)致系統(tǒng)的設(shè)計(jì)變得復(fù)雜.
  • 如果不恰當(dāng)?shù)卦O(shè)計(jì)橋梁接口和實(shí)現(xiàn)類,可能會導(dǎo)致系統(tǒng)的耦合度增加.

應(yīng)用場景

  • 當(dāng)一個(gè)類具有多個(gè)變化維度(例如,一個(gè)形狀類有不同的顏色和尺寸)時(shí),可以使用橋梁模式來將它們分離開來,從而使得系統(tǒng)更加靈活.
  • 當(dāng)需要支持不同平臺,數(shù)據(jù)庫或協(xié)議時(shí),可以使用橋梁模式來封裝這些實(shí)現(xiàn)細(xì)節(jié),使得客戶端和實(shí)現(xiàn)部分可以獨(dú)立變化,而不影響彼此.
  • 當(dāng)需要運(yùn)行時(shí)動態(tài)地切換實(shí)現(xiàn)時(shí),可以使用橋梁模式來實(shí)現(xiàn)這種切換.

到此這篇關(guān)于Java橋梁設(shè)計(jì)模式優(yōu)雅地將抽象與實(shí)現(xiàn)分離的文章就介紹到這了,更多相關(guān)Java橋梁設(shè)計(jì)模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java數(shù)據(jù)結(jié)構(gòu)中堆的向下和向上調(diào)整解析

    Java數(shù)據(jù)結(jié)構(gòu)中堆的向下和向上調(diào)整解析

    堆是一顆完全二叉樹,在這棵樹中,所有父節(jié)點(diǎn)都滿足大于等于其子節(jié)點(diǎn)的堆叫大根堆,所有父節(jié)點(diǎn)都滿足小于等于其子節(jié)點(diǎn)的堆叫小根堆。堆雖然是一顆樹,但是通常存放在一個(gè)數(shù)組中,父節(jié)點(diǎn)和孩子節(jié)點(diǎn)的父子關(guān)系通過數(shù)組下標(biāo)來確定
    2021-11-11
  • Springboot中的三個(gè)基本架構(gòu)

    Springboot中的三個(gè)基本架構(gòu)

    這篇文章主要介紹了Springboot中的三個(gè)基本架構(gòu),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Spring實(shí)現(xiàn)文件上傳(示例代碼)

    Spring實(shí)現(xiàn)文件上傳(示例代碼)

    Spring可以繼承commons-fileupload插件來實(shí)現(xiàn)文件上傳的功能。分為前端JSP編寫和后臺Controller的編寫
    2013-10-10
  • 關(guān)于MVC的dao層、service層和controller層詳解

    關(guān)于MVC的dao層、service層和controller層詳解

    這篇文章主要介紹了關(guān)于MVC的dao層、service層和controller層詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java synchronized同步靜態(tài)方法和同步非靜態(tài)方法的異同

    java synchronized同步靜態(tài)方法和同步非靜態(tài)方法的異同

    這篇文章主要介紹了java synchronized同步靜態(tài)方法和同步非靜態(tài)方法的異同的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • springboot jsp支持以及轉(zhuǎn)發(fā)配置方式

    springboot jsp支持以及轉(zhuǎn)發(fā)配置方式

    文章介紹了如何在Spring Boot項(xiàng)目中配置和使用JSP,并提供了一步一步的指導(dǎo),包括添加依賴、配置文件設(shè)置、控制器和視圖的使用
    2024-12-12
  • SpringBoot+Jersey跨域文件上傳的實(shí)現(xiàn)示例

    SpringBoot+Jersey跨域文件上傳的實(shí)現(xiàn)示例

    在SpringBoot開發(fā)后端服務(wù)時(shí),我們一般是提供接口給前端使用,本文主要介紹了SpringBoot+Jersey跨域文件上傳的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • 淺析Spring?中?Bean?的理解與使用

    淺析Spring?中?Bean?的理解與使用

    這篇文章主要介紹了Spring?中?Bean?的理解與使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 基于MapperXML掃描的問題

    基于MapperXML掃描的問題

    這篇文章主要介紹了MapperXML掃描的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 關(guān)于Spring啟動流程及Bean生命周期梳理

    關(guān)于Spring啟動流程及Bean生命周期梳理

    這篇文章主要介紹了關(guān)于Spring啟動流程及Bean生命周期梳理,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論

罗源县| 隆子县| 河北省| 大连市| 丰原市| 黑河市| 象山县| 临澧县| 永靖县| 麦盖提县| 南乐县| 平武县| 油尖旺区| 比如县| 塘沽区| 共和县| 徐水县| 扶余县| 温州市| 凤庆县| 勐海县| 宿迁市| 甘泉县| 南汇区| 和田市| 崇阳县| 织金县| 铁力市| 新龙县| 石家庄市| 吴忠市| 长丰县| 兴文县| 荥经县| 洪雅县| 永寿县| 交城县| 阿克陶县| 东光县| 丽水市| 毕节市|