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

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

 更新時(shí)間:2021年12月30日 15:48:38   作者:空山新雨后~  
裝飾模式是指在不改變現(xiàn)有對(duì)象結(jié)構(gòu)的情況下,動(dòng)態(tài)地給該對(duì)象增加一些職責(zé)(即增加其額外功能)的模式,它屬于對(duì)象結(jié)構(gòu)型模式。本文將為大家詳細(xì)介紹一下裝飾模式,感興趣的可以了解一下

一、裝飾模式的定義和特點(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é)任。

圖示

三、咖啡點(diǎn)單案例演示

有一個(gè)需求,點(diǎn)一杯咖啡需要咖啡,材料等等,這個(gè)案例就很適合裝飾模式,類似于穿衣,點(diǎn)餐,買包子,等等,我們?cè)趺窗阉O(shè)計(jì)成裝飾模式呢?

看類圖

這個(gè)結(jié)構(gòu)就是我已經(jīng)設(shè)計(jì)好的一個(gè)裝飾模式的類圖,idea自動(dòng)生成的,這里的Drink就是我們上面說的抽象構(gòu)建角色,裝飾者是Decorator,他是一個(gè)抽象裝飾,下面他的子類就是具體的裝飾者,那么具體構(gòu)建中間我們提供了一個(gè)中間構(gòu)建,提供了coffee的一些共性,可以放在這里,用的時(shí)候直接繼承,他的下面就是相應(yīng)的具體構(gòu)件,具體被裝飾者角色,裝飾者與被裝飾者共同繼承自component抽象構(gòu)件,需要用到裝飾的就是我們點(diǎn)一杯咖啡,用裝飾去包裹即可,層層包裹,案例如下:

比如我要點(diǎn)一份加糖加奶的拿鐵咖啡

代碼實(shí)例:

component抽象構(gòu)件角色:

package com.decoratorPattern.starBucks;
 
/**
 * @author wang
 * @version 1.0
 * @packageName com.decoratorPattern.starBucks
 * @className Drink
 * @date 2021/12/28 10:28
 * @Description 飲料構(gòu)件類抽象component
 */
public abstract class Drink {
    private String description;
    private float price = 0.0f;
 
    public String getDescription() {
        return description;
    }
 
    public void setDescription(String description) {
        this.description = description;
    }
 
    public float getPrice() {
        return price;
    }
 
    public void setPrice(float price) {
        this.price = price;
    }
 
    /**
     * @Date  2021/12/28 10:30
     * @Param
     * @Return float
     * @MetodName cost
     * @Author wang
     * @Description 計(jì)算花費(fèi),訂單價(jià)格
     */
    public abstract float cost();
}

裝飾者類:

package com.decoratorPattern.starBucks;
 
/**
 * @author wang
 * @version 1.0
 * @packageName com.decoratorPattern.starBucks
 * @className Decorator
 * @date 2021/12/28 10:40
 * @Description 裝飾者定義類,配料
 */
public class Decorator extends Drink {
 
    private Drink drink;
 
    /**
     * @param drink
     * @Date 2021/12/28 10:42
     * @Param
     * @Return null
     * @MetodName Decorator
     * @Author wang
     * @Description 傳入一個(gè)被裝飾者,由裝飾者進(jìn)行裝飾
     */
    public Decorator(Drink drink) {
        this.drink = drink;
    }
 
    /**
     * @Date 2021/12/28 10:43
     * @Param
     * @Return float
     * @MetodName cost
     * @Author wang
     * @Description 裝飾者的價(jià)格加上被裝飾者的價(jià)格
     */
    @Override
    public float cost() {
        return super.getPrice() + drink.cost();
    }
 
    /**
     * @Date 2021/12/28 10:44
     * @Param
     * @Return String
     * @MetodName getDescription
     * @Author wang
     * @Description 輸出訂單信息,包含裝飾者,裝飾者的價(jià)格,以及被裝飾者的信息
     */
    @Override
    public String getDescription() {
        return drink.getDescription() + "\n加入的材料:" + super.getDescription()
                + "\t材料價(jià)格:" + super.getPrice() ;
    }
}
package com.decoratorPattern.starBucks;
 
/**
 * @author wang
 * @version 1.0
 * @packageName com.decoratorPattern.starBucks
 * @className Coffee
 * @date 2021/12/28 10:31
 * @Description 咖啡類
 */
public class Coffee extends Drink{
    @Override
    public float cost() {
        return super.getPrice();
    }
}

具體構(gòu)件類:拿鐵

package com.decoratorPattern.starBucks;
 
/**
 * @author wang
 * @version 1.0
 * @packageName com.decoratorPattern.starBucks
 * @className latte
 * @date 2021/12/28 10:32
 * @Description 拿鐵咖啡實(shí)類,被裝飾者
 */
public class Latte extends Coffee{
    public Latte() {
        setDescription("拿鐵咖啡");
        setPrice(15.0f);
    }
}

具體構(gòu)件類:摩卡

package com.decoratorPattern.starBucks;
 
/**
 * @author wang
 * @version 1.0
 * @packageName com.decoratorPattern.starBucks
 * @className Mocha
 * @date 2021/12/28 10:36
 * @Description 摩卡咖啡實(shí)類,被裝飾者
 */
public class Mocha extends Coffee {
    public Mocha() {
        setDescription("摩卡咖啡");
        setPrice(12.2f);
    }
}

其他同上,不過多展示

具體裝飾類:牛奶

package com.decoratorPattern.starBucks;
 
/**
 * @author wang
 * @version 1.0
 * @packageName com.decoratorPattern.starBucks
 * @className Milk
 * @date 2021/12/28 10:47
 * @Description 牛奶調(diào)味品,具體裝飾者
 */
public class Milk extends Decorator{
 
    /**
     * @param drink
     * @Date 2021/12/28 10:42
     * @Param
     * @Return null
     * @MetodName Decorator
     * @Author wang
     * @Description 傳入一個(gè)被裝飾者,由裝飾者進(jìn)行裝飾
     */
    public Milk(Drink drink) {
        super(drink);
        setDescription("牛奶");
        setPrice(1.0f);
    }
}

具體裝飾:糖

package com.decoratorPattern.starBucks;
 
/**
 * @author wang
 * @version 1.0
 * @packageName com.decoratorPattern.starBucks
 * @className sugar
 * @date 2021/12/28 10:50
 * @Description 糖,裝飾者
 */
public class Sugar extends Decorator{
    /**
     * @param drink
     * @Date 2021/12/28 10:42
     * @Param
     * @Return null
     * @MetodName Decorator
     * @Author wang
     * @Description 傳入一個(gè)被裝飾者,由裝飾者進(jìn)行裝飾
     */
    public Sugar(Drink drink) {
        super(drink);
        setDescription("糖");
        setPrice(0.5f);
    }
}

訂單測(cè)試代碼:

package com.decoratorPattern.starBucks;
 
/**
 * @author wang
 * @version 1.0
 * @packageName com.decoratorPattern.starBucks
 * @className OrderTest
 * @date 2021/12/28 10:51
 * @Description 前臺(tái)訂單類
 */
public class OrderTest {
    public static void main(String[] args) {
        //點(diǎn)一份加糖加奶的拿鐵咖啡
 
        System.out.println("+++++++沒加任何東西+++++++");
        Drink latte = new Latte();
        System.out.println("當(dāng)前總價(jià):" + latte.cost());
        System.out.println("coffee:" +latte.getDescription());
        //加糖
        System.out.println("+++++++加糖后+++++++");
        latte = new Sugar(latte);
        System.out.println("當(dāng)前總價(jià):" + latte.cost());
        System.out.println("coffee:" + latte.getDescription());
 
        System.out.println("+++++++加奶后+++++++");
        latte = new Milk(latte);
        System.out.println("當(dāng)前總價(jià):" + latte.cost());
        System.out.println("coffee:" +latte.getDescription());
    }
}
/**
 * +++++++沒加任何東西+++++++
 * 當(dāng)前總價(jià):15.0
 * coffee:拿鐵咖啡
 * +++++++加糖后+++++++
 * 當(dāng)前總價(jià):15.5
 * coffee:拿鐵咖啡
 * 加入的材料:糖	材料價(jià)格:0.5
 * +++++++加奶后+++++++
 * 當(dāng)前總價(jià):16.5
 * coffee:拿鐵咖啡
 * 加入的材料:糖	材料價(jià)格:0.5
 * 加入的材料:牛奶	材料價(jià)格:1.0
 *
 * Process finished with exit code 0
 */

綜上, 如果我們需要新的咖啡種類或者是新的調(diào)料,只需要新增類去繼承coffee或者decorator類即可。

四、總結(jié)

裝飾模式是為已有的功能動(dòng)態(tài)的添加更多功能的一種方式,當(dāng)系統(tǒng)需要新功能的時(shí)候,向舊的類中添加新的代碼,這些新加的代碼通常裝飾了原有類的核心職責(zé)或主要行為。

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

把類中裝飾功能從類中移除,這樣可以簡化原來的類,

有效的把類的核心職責(zé)和裝飾功能分開了,而且可以去除相關(guān)類中的重復(fù)裝飾邏輯

可代替繼承。?

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

相關(guān)文章

  • SpringBoot在項(xiàng)目中訪問靜態(tài)資源步驟分析

    SpringBoot在項(xiàng)目中訪問靜態(tài)資源步驟分析

    今天在玩SpringBoot的demo的時(shí)候,放了張圖片在resources目錄下,啟動(dòng)區(qū)訪問的時(shí)候,突然好奇是識(shí)別哪些文件夾來展示靜態(tài)資源的, 為什么有時(shí)候放的文件夾不能顯示,有的卻可以
    2023-01-01
  • 詳細(xì)學(xué)習(xí)Java Cookie技術(shù)(用戶登錄、瀏覽、訪問權(quán)限)

    詳細(xì)學(xué)習(xí)Java Cookie技術(shù)(用戶登錄、瀏覽、訪問權(quán)限)

    這篇文章主要為大家詳細(xì)介紹了Java Cookie技術(shù),顯示用戶上次登錄的時(shí)間、顯示用戶最近瀏覽的若干個(gè)圖片(按比例縮放)等,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Spring?Boot用戶注冊(cè)驗(yàn)證的實(shí)現(xiàn)全過程記錄

    Spring?Boot用戶注冊(cè)驗(yàn)證的實(shí)現(xiàn)全過程記錄

    最近在設(shè)計(jì)自己的博客系統(tǒng),涉及到用戶注冊(cè)與登錄驗(yàn)證,所以下面這篇文章主要給大家介紹了關(guān)于Spring?Boot用戶注冊(cè)驗(yàn)證的實(shí)現(xiàn)全過程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • 幾種SpringBoot的屬性配置方式詳解

    幾種SpringBoot的屬性配置方式詳解

    通常項(xiàng)目配置信息都寫在.properties或者.yml文件中,但是打成jar包部署后,如果需要修改配置信息,還需要改完再重新打包部署,因此,下面介紹幾種SpringBoot的屬性配置方式,需要的朋友可以參考下
    2024-12-12
  • Java Comparator.comparing比較導(dǎo)致空指針異常的解決

    Java Comparator.comparing比較導(dǎo)致空指針異常的解決

    這篇文章主要介紹了Java Comparator.comparing比較導(dǎo)致空指針異常的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中Arrays.asList()方法詳解及實(shí)例

    Java中Arrays.asList()方法詳解及實(shí)例

    這篇文章主要介紹了Java中Arrays.asList()方法將數(shù)組作為列表時(shí)的一些差異的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • SpringBoot中的ApplicationListener事件監(jiān)聽器使用詳解

    SpringBoot中的ApplicationListener事件監(jiān)聽器使用詳解

    這篇文章主要介紹了SpringBoot中的ApplicationListener事件監(jiān)聽器使用詳解,ApplicationListener是應(yīng)用程序的事件監(jiān)聽器,繼承自java.util.EventListener標(biāo)準(zhǔn)接口,采用觀察者設(shè)計(jì)模式,需要的朋友可以參考下
    2023-11-11
  • 利用Java計(jì)算某個(gè)日期是星期幾

    利用Java計(jì)算某個(gè)日期是星期幾

    不知道大家有沒有遇到過同樣的問題,誰誰的生日又要到了,看看是星期幾?每年都要遇到好幾次,所以想索性利用Java寫個(gè)小工具,一次查詢某具體日期在n年中分別是星期幾。這樣不就方便了嗎?本文里給出了詳細(xì)的示例代碼,感興趣的朋友們下面來一起看看吧。
    2016-10-10
  • SpringBoot實(shí)用小技巧之如何動(dòng)態(tài)設(shè)置日志級(jí)別

    SpringBoot實(shí)用小技巧之如何動(dòng)態(tài)設(shè)置日志級(jí)別

    這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)用小技巧之如何動(dòng)態(tài)設(shè)置日志級(jí)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Springboot Thymeleaf數(shù)字對(duì)象使用方法

    Springboot Thymeleaf數(shù)字對(duì)象使用方法

    這篇文章主要介紹了Springboot Thymeleaf數(shù)字對(duì)象使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2007-09-09

最新評(píng)論

鸡东县| 芜湖市| 平和县| 班玛县| 平昌县| 隆化县| 榆社县| 大关县| 建昌县| 武隆县| 枣强县| 百色市| 祥云县| 开鲁县| 耒阳市| 榆林市| 林甸县| 乌鲁木齐县| 嘉禾县| 吴桥县| 胶州市| 开封市| 铜鼓县| 南陵县| 舒兰市| 呼和浩特市| 栖霞市| 延长县| 玛纳斯县| 合江县| 澳门| 牡丹江市| 新河县| 永胜县| 密山市| 长垣县| 泌阳县| 孟村| 竹溪县| 泗水县| 涞源县|