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

Java設(shè)計(jì)模式之裝飾模式詳解

 更新時(shí)間:2022年08月27日 15:33:16   作者:niuyongzhi  
這篇文章主要介紹了Java設(shè)計(jì)模式中的裝飾者模式,裝飾者模式即Decorator Pattern,裝飾模式是在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能,裝飾模式又名包裝模式。裝飾器模式以對(duì)客戶端透明的方式拓展對(duì)象的功能,是繼承關(guān)系的一種替代方案

1.什么是裝飾模式

當(dāng)我們想要改進(jìn)或增強(qiáng)某個(gè)對(duì)象的功能,而又不想繼承該類創(chuàng)建子類,可以考慮使用裝飾模式。

使用裝飾模式增強(qiáng)對(duì)象的某個(gè)功能,比生成子類再增強(qiáng),更為靈活。

2.如何實(shí)現(xiàn)

1)抽象組件:定義一個(gè)抽象類,該抽象類定義了“被裝飾者”需要被“裝飾的方法”

2)具體組件:抽象組件的一個(gè)子類。成為“被裝飾類”

3)裝飾組件:也是抽象組件的一個(gè)子類。該類中持有“被裝飾者”的引用,用來(lái)調(diào)用被裝飾者的方法??梢詾槌橄箢悾部梢允欠浅橄箢?。

4)具體裝飾類:是裝飾組件的一個(gè)子類,被稱為“裝飾者”

3.代碼實(shí)現(xiàn)

1)抽象組件

/**
 * 抽象組件,定義了被裝飾類需要裝飾的方法
 */
public abstract class ICake {
    /**
     * 需要裝飾的方法
     * @return
     */
    public abstract int getPrice();
}

2)被裝飾者

/**
 * 被裝飾者,是抽象組件的一個(gè)子類,定義需要被裝飾的方法
 */
public class Cake extends ICake {
    /**
     * 被裝飾類中,裝飾方法的基本實(shí)現(xiàn)
     * @return
     */
    @Override
    public int getPrice() {
        System.out.println("getPrice");
       return 100;
    }
}

3)裝飾類

/**
 * 裝飾類,也是抽象組件的一個(gè)子類。
 * 可以是抽象類,也可以是非抽象類。
 */
public abstract class CakeDecorator extends ICake {
    /**
     * 被裝飾類的引用,需要在裝飾類中,調(diào)用到被裝飾類的方法。
     */
    ICake cake;
    public CakeDecorator(ICake cake){
        this.cake = cake;
    }
}

4)具體裝飾

/**
 * 具體裝飾類
 */
public class BlueBerryCake extends CakeDecorator {
    public BlueBerryCake(ICake cake) {
        super(cake);
    }
    /**
     * 被裝飾的方法
     * 在調(diào)用到被裝飾類的基礎(chǔ)方法后,還要調(diào)用裝飾類要增強(qiáng)的方法
     * @return
     */
    @Override
    public float getPrice(){
        return cake.getPrice()+elsePrice();
    }
    /**
     * 增強(qiáng)的方法
     * @return
     */
    private float elsePrice(){
        System.out.println("else getPrice");
        return 50;
    }
}

5)測(cè)試類

public class TestDecorator {
    public static void main(String args[]){
        ICake cake = new Cake();
        CakeDecorator decorater = new BlueBerryCake(cake);
        float price = decorater.getPrice();
        System.out.println(price);
    }
}

4.拓展

1)利用子類繼承也能實(shí)現(xiàn)某個(gè)方法的增強(qiáng)。相比通過(guò)裝飾模式實(shí)現(xiàn),裝飾模式有和優(yōu)勢(shì)?

被裝飾者和裝飾者是松耦合關(guān)系。裝飾類僅僅依賴于抽象組件,裝飾類只需要知道被裝飾類是抽象組件的一個(gè)子類,而不必知道具體是哪個(gè)子類。

裝飾模式滿足“開(kāi)-閉原則”,不必修改具體組件,就可以增加針對(duì)該組件的裝飾類。

5.JavaIo與裝飾模式

java.IO包中的很多類使用了裝飾模式。

Reader

FileReader

BufferdReader

到此這篇關(guān)于Java設(shè)計(jì)模式之裝飾模式詳解的文章就介紹到這了,更多相關(guān)Java裝飾模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 日志打印的15個(gè)好建議

    Java 日志打印的15個(gè)好建議

    這篇文章主要介紹了Java日志打印的15個(gè)好建議,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • 淺析IDEA如何正確配置Gradle? GRADLE_USER_HOME 和 Gradle user home的區(qū)別

    淺析IDEA如何正確配置Gradle? GRADLE_USER_HOME 和 Gradle user home的區(qū)別

    這篇文章主要介紹了IDEA如何正確配置Gradle? GRADLE_USER_HOME 和 Gradle user home的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • JAVA Future類的使用詳解

    JAVA Future類的使用詳解

    這篇文章主要介紹了JAVA Future類的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04
  • Java微信小程序oss圖片上傳的實(shí)現(xiàn)方法

    Java微信小程序oss圖片上傳的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java微信小程序oss圖片上傳的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Spring多個(gè)數(shù)據(jù)源配置詳解

    Spring多個(gè)數(shù)據(jù)源配置詳解

    在實(shí)際場(chǎng)景中,會(huì)有需要配置多個(gè)數(shù)據(jù)源的場(chǎng)景,本文就介紹一下如何配置Spring多數(shù)據(jù)源,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-08-08
  • 使用springBoot項(xiàng)目配置文件位置調(diào)整到打包外

    使用springBoot項(xiàng)目配置文件位置調(diào)整到打包外

    這篇文章主要介紹了使用springBoot項(xiàng)目配置文件位置調(diào)整到打包外,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟記錄

    IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟記錄

    這篇文章主要給大家介紹了關(guān)于IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • java實(shí)現(xiàn)微信掃碼支付功能

    java實(shí)現(xiàn)微信掃碼支付功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)微信掃碼支付功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • SpringBoot3集成SLF4J+logback進(jìn)行日志記錄的實(shí)現(xiàn)

    SpringBoot3集成SLF4J+logback進(jìn)行日志記錄的實(shí)現(xiàn)

    本文主要介紹了SpringBoot3集成SLF4J+logback進(jìn)行日志記錄的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java時(shí)間戳類Instant的使用詳解

    Java時(shí)間戳類Instant的使用詳解

    這篇文章主要為大家詳細(xì)介紹了Java中時(shí)間戳類Instant的使用方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下
    2022-09-09

最新評(píng)論

衡南县| 揭东县| 老河口市| 宁明县| 高碑店市| 安乡县| 交口县| 揭东县| 娄底市| 晴隆县| 潞西市| 桓仁| 佛学| 安达市| 会理县| 灵璧县| 昌乐县| 长春市| 永嘉县| 台北市| 南漳县| 山东| 灌阳县| 邵阳市| 手游| 衡南县| 云浮市| 于田县| 布拖县| 邵武市| 泽普县| 海淀区| 绩溪县| 峨山| 奉新县| 古蔺县| 永和县| 江口县| 通河县| 武宣县| 江北区|