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

Java裝飾者模式的示例詳解

 更新時(shí)間:2022年02月25日 16:24:19   作者:溫故知新之java  
裝飾者模式:在不改變?cè)袑?duì)象的基礎(chǔ)之上,動(dòng)態(tài)的將功能附加到對(duì)象上,提供了繼承更有彈性的替代方案,也體現(xiàn)了開閉原則。本文將通過示例詳細(xì)講解一下裝飾者模式,需要的可以參考一下

定義

裝飾者模式:在不改變?cè)袑?duì)象的基礎(chǔ)之上,動(dòng)態(tài)的將功能附加到對(duì)象上,提供了繼承更有彈性的替代方案,也體現(xiàn)了開閉原則

案例

需求

一個(gè)人去咖啡店點(diǎn)了一杯卡布奇諾,加了一份熱牛奶

方案

定義咖啡基類

public abstract class Coffee {
    private String desc;

    private float price;

    public abstract float cost();

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }
}

定義卡布奇諾咖啡類,繼承咖啡基類

public class Cappuccino extends Coffee{
    public Cappuccino(){
        setDesc("點(diǎn)了一杯卡布奇諾");
        setPrice(100);
    }

    @Override
    public float cost() {
        System.out.println("當(dāng)前價(jià)格為:" + super.getPrice());
        return super.getPrice();
    }
}

定義裝飾者類

public class Decorator extends Coffee{

    private Coffee coffee;

    public Decorator(Coffee coffee){
        this.coffee = coffee;
    }

    @Override
    public float cost() {
        return super.getPrice() + this.coffee.cost();
    }

    @Override
    public String getDesc() {
        return super.getDesc() + coffee.cost();
    }
}

定義熱牛奶類

public class HotMilk extends Decorator {
    public HotMilk(Coffee coffee){
        super(coffee);
        setPrice(200);
        setDesc("點(diǎn)了一杯熱牛奶");
    }
}

定義測(cè)試類

public class Test {
    public static void main(String[] args) {
        // 點(diǎn)了一杯卡布奇諾,還加了一份熱牛奶
        Coffee coffee = new Cappuccino();
        System.out.println(coffee.getDesc());
        //System.out.println(coffee.getPrice());
        System.out.println(coffee.cost());;

        HotMilk hotMilk = new HotMilk(coffee);
        System.out.println(hotMilk.getDesc());
        //System.out.println(hotMilk.getPrice());
        System.out.println(hotMilk.cost());
    }
}

查看測(cè)試結(jié)果

分析

裝飾者模式的目的也是為了擴(kuò)展對(duì)象的功能,是繼承的一個(gè)替代模式,可以動(dòng)態(tài)的擴(kuò)展一個(gè)實(shí)現(xiàn)類的功能,裝飾類和被裝飾類可以相互獨(dú)立,不會(huì)耦合,靈活方便。

使用場景

  • 需要給一個(gè)現(xiàn)有類添加職責(zé),但是有不能采用生成子類的方式去擴(kuò)充的時(shí)候,
  • 當(dāng)需要對(duì)于現(xiàn)有的一組基本功能進(jìn)行組合,會(huì)產(chǎn)生非常多的功能的時(shí)候
  • 當(dāng)對(duì)象的功能要求可以動(dòng)態(tài)的添加,或者說的動(dòng)態(tài)的撤銷

知識(shí)點(diǎn)補(bǔ)充

裝飾模式的定義和特點(diǎn)

在軟件開發(fā)過程中,有時(shí)想用一些現(xiàn)存的組件。這些組件可能只是完成了一些核心功能。但在不改變其結(jié)構(gòu)的情況下,可以動(dòng)態(tài)地?cái)U(kuò)展其功能。所有這些都可以釆用裝飾器模式來實(shí)現(xiàn)。

就像我們做菜,需要用到調(diào)料,菜,刀,火等一系列抽象的組件來最終完成一道菜。

裝飾模式的定義:

指在不改變現(xiàn)有對(duì)象結(jié)構(gòu)的情況下,動(dòng)態(tài)地給該對(duì)象增加一些職責(zé)(即增加其額外功能)的模式,它屬于對(duì)象結(jié)構(gòu)型模式。就增加功能來說,裝飾模式比生成子類更加靈活。

特點(diǎn):

  • 裝飾器是繼承的有力補(bǔ)充,比繼承靈活,在不改變?cè)袑?duì)象的情況下,動(dòng)態(tài)的給一個(gè)對(duì)象擴(kuò)展功能,即插即用
  • 通過使用不用裝飾類及這些裝飾類的排列組合,可以實(shí)現(xiàn)不同效果
  • 裝飾器模式完全遵守開閉原則

缺點(diǎn)

裝飾器模式會(huì)增加許多子類,過度使用會(huì)增加程序得復(fù)雜性。

裝飾模式的結(jié)構(gòu)

裝飾模式的結(jié)構(gòu)一般包含以下幾個(gè)角色

1. 抽象構(gòu)件(Component)角色:定義一個(gè)抽象接口以規(guī)范準(zhǔn)備接收附加責(zé)任的對(duì)象。

2. 具體構(gòu)件(ConcreteComponent)角色:實(shí)現(xiàn)抽象構(gòu)件,通過裝飾角色為其添加一些職責(zé)。

3. 抽象裝飾(Decorator)角色:繼承抽象構(gòu)件,并包含具體構(gòu)件的實(shí)例,可以通過其子類擴(kuò)展具體構(gòu)件的功能。

4. 具體裝飾(ConcreteDecorator)角色:實(shí)現(xiàn)抽象裝飾的相關(guān)方法,并給具體構(gòu)件對(duì)象添加附加的責(zé)任。

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

相關(guān)文章

  • 詳解Spring中的JavaConfig注解

    詳解Spring中的JavaConfig注解

    在開發(fā)Java程序,尤其是Java EE應(yīng)用的時(shí)候,總是免不了與各種配置文件打交道。java注解則幫我們使之更整潔,不會(huì)配置文件滿天飛了。 下面這篇文章主要介紹了Spring中的JavaConfig注解,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • j2Cache線上異常排查問題解決記錄分析

    j2Cache線上異常排查問題解決記錄分析

    這篇文章主要為大家介紹了關(guān)于j2Cache線上異常排查的問題解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • Springboot jar包遠(yuǎn)程調(diào)試詳解

    Springboot jar包遠(yuǎn)程調(diào)試詳解

    這篇文章主要為大家詳細(xì)介紹了Springboot jar包遠(yuǎn)程調(diào)試,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 詳細(xì)介紹Java阿里云的短信驗(yàn)證碼實(shí)現(xiàn)

    詳細(xì)介紹Java阿里云的短信驗(yàn)證碼實(shí)現(xiàn)

    這篇文章主要介紹了詳細(xì)介紹Java阿里云的短信驗(yàn)證碼實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • MyBatis Plus中InnerInterceptor的實(shí)現(xiàn)

    MyBatis Plus中InnerInterceptor的實(shí)現(xiàn)

    本文主要介紹了MyBatis Plus中InnerInterceptor的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • java實(shí)現(xiàn)從網(wǎng)上下載圖片到本地的方法

    java實(shí)現(xiàn)從網(wǎng)上下載圖片到本地的方法

    這篇文章主要介紹了java實(shí)現(xiàn)從網(wǎng)上下載圖片到本地的方法,涉及java針對(duì)文件操作的相關(guān)技巧,非常簡單實(shí)用,需要的朋友可以參考下
    2015-07-07
  • Java判斷時(shí)間段內(nèi)文件是否更新的方法

    Java判斷時(shí)間段內(nèi)文件是否更新的方法

    這篇文章主要介紹了Java判斷時(shí)間段內(nèi)文件是否更新的方法,通過實(shí)例形式講述了定時(shí)器、類加載器及線程等方法實(shí)現(xiàn)判斷文件更新的功能,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • java實(shí)現(xiàn)微信企業(yè)付款到個(gè)人功能

    java實(shí)現(xiàn)微信企業(yè)付款到個(gè)人功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)微信企業(yè)付款到個(gè)人功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Java二叉樹查詢?cè)砩钊敕治鲋v解

    Java二叉樹查詢?cè)砩钊敕治鲋v解

    這篇文章主要介紹了Java二叉樹查詢?cè)?,二叉查找樹,又稱二叉排序樹,亦稱二叉搜索樹,是數(shù)據(jù)結(jié)構(gòu)中的一類。在一般情況下,查找效率比鏈表結(jié)構(gòu)要高
    2022-11-11
  • 解決配置Feign時(shí)報(bào)錯(cuò)PathVariable annotation was empty on param 0.

    解決配置Feign時(shí)報(bào)錯(cuò)PathVariable annotation was empty

    在配置Feign客戶端時(shí),如果遇到`@PathVariable`注解為空的問題,是因?yàn)樵诼暶鹘涌诜椒〞r(shí)沒有為`@PathVariable`注解提供`value`屬性,解決方法是為`@PathVariable`注解添加`value`屬性,這樣就可以避免報(bào)錯(cuò),并成功啟動(dòng)Feign客戶端
    2024-11-11

最新評(píng)論

水城县| 得荣县| 公安县| 辽宁省| 渝北区| 运城市| 霞浦县| 林芝县| 灵寿县| 雷州市| 即墨市| 绍兴县| 五华县| 仙游县| 大同县| 东城区| 巫山县| 固始县| 三门县| 长治县| 密云县| 通城县| 尚义县| 安庆市| 通渭县| 吴忠市| 齐河县| 黄大仙区| 新兴县| 汉沽区| 木里| 平罗县| 神木县| 屏东县| 张家港市| 永仁县| 津南区| 米泉市| 绍兴县| 遵化市| 永城市|