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

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

 更新時(shí)間:2022年07月19日 10:02:14   作者:愛學(xué)習(xí)的大魚???????  
這篇文章主要介紹了Java設(shè)計(jì)模式中的裝飾者模式,裝飾者模式即Decorator?Pattern,裝飾模式是在不必改變原類文件和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能

模式介紹

23種設(shè)計(jì)模式之一,英文叫Decorator Pattern,又叫裝飾者模式。裝飾模式是在不必改變原類文件和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來包裹真實(shí)的對(duì)象。

UML類圖

類圖解析:

  • Componet:主體
  • ConcreateComponent:主體具體實(shí)現(xiàn)類
  • Decorator:裝飾者
  • ConcreteDecorate:裝飾者具體實(shí)現(xiàn)類

裝飾者模式案例

背景介紹:有一家咖啡店,店中有許多品種的咖啡(ShortBlack、Decaf、Espresso…),咖啡可以添加不同口味(Chocolate、Milk、Soy等),采用裝飾者模式可以很好的解決該問題

裝飾者下單 (2份巧克力+1份牛奶+LangBlack) 如下圖所示:

類結(jié)構(gòu)圖

Drink、Coffee及其子類代碼如下:

public abstract class Drink {
    private String des;//描述
    private float price = 0.0f;
    /**
     * 計(jì)算價(jià)格的方法
     * @return
     */
    public abstract float cost();
    public String getDes() {
        return des;
    }
    public void setDes(String des) {
        this.des = des;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
}
public class Coffee extends Drink{
    @Override
    public float cost() {
        return super.getPrice();
    }
}
public class ShortBlack extends Coffee{
    public ShortBlack() {
        setDes("濃縮咖啡");
        setPrice(4);
    }
}
public class Espresso extends Coffee{
    public Espresso() {
        setPrice(6);
        setDes("意大利咖啡");
    }
}
public class LongBlack extends Coffee{
    public LongBlack() {
        setPrice(5);
        setDes("美式咖啡");
    }
}

Decorator及其子類

public class Decorator extends Drink {
    private Drink drink;
    public Decorator(Drink drink) { // 聚合
        this.drink = drink;
    }
    @Override
    public float cost() {
        // 調(diào)料的價(jià)格 + 咖啡的價(jià)格
        return super.getPrice() + drink.cost();
    }
    @Override
    public String getDes() {
        return super.getDes() + " && " + drink.getDes();
    }
}
public class Chocolate extends Decorator{
    public Chocolate(Drink drink) {
        super(drink);
        setDes("巧克力");
        setPrice(3);
    }
}
public class Milk extends Decorator{
    public Milk(Drink drink) {
        super(drink);
        setDes("牛奶");
        setPrice(2);
    }
}
public class Soy extends Decorator{
    public Soy(Drink drink) {
        super(drink);
        setDes("豆?jié){");
        setPrice(1.5f);
    }
}

CoffeeBar測試類

public class CoffeeBar {
    public static void main(String[] args) {
        // 點(diǎn)一份咖啡
        Drink order = new LongBlack();
        System.out.println(order.cost() + "$\t" + order.getDes());

        // 加一份牛奶
        order = new Milk(order);
        System.out.println(order.cost() + "$\t" + order.getDes());

        // 加兩份巧克力
        order = new Chocolate(order);
        System.out.println(order.cost() + "$\t" + order.getDes());
        order = new Chocolate(order);
        System.out.println(order.cost() + "$\t" + order.getDes());
    }
}

實(shí)現(xiàn)結(jié)果:

裝飾者模式優(yōu)點(diǎn)

  • Decorator模式與繼承關(guān)系的目的都是要擴(kuò)展對(duì)象的功能,但是Decorator可以提供比繼承更多的靈活性。
  • 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設(shè)計(jì)師可以創(chuàng)造出很多不同行為的組合。

裝飾者模式缺點(diǎn)

  • 這種比繼承更加靈活機(jī)動(dòng)的特性,也同時(shí)意味著更加多的復(fù)雜性。
  • 裝飾模式會(huì)導(dǎo)致設(shè)計(jì)中出現(xiàn)許多小類,如果過度使用,會(huì)使程序變得很復(fù)雜。
  • 裝飾模式是針對(duì)抽象組件(Component)類型編程。但是,如果你要針對(duì)具體組件編程時(shí),就應(yīng)該重新思考你的應(yīng)用架構(gòu),以及裝飾者是否合適。當(dāng)然也可以改變Component接口,增加新的公開的行為,實(shí)現(xiàn)“半透明”的裝飾者模式。在實(shí)際項(xiàng)目中要做出最佳選擇。

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

相關(guān)文章

  • java計(jì)算方差、標(biāo)準(zhǔn)差(均方差)實(shí)例代碼

    java計(jì)算方差、標(biāo)準(zhǔn)差(均方差)實(shí)例代碼

    在本篇文章里小編給大家分享了關(guān)于java計(jì)算方差、標(biāo)準(zhǔn)差(均方差)實(shí)例代碼以及相關(guān)知識(shí)點(diǎn),需要的朋友們可以參考下。
    2019-08-08
  • java?-jar命令詳解之運(yùn)行JAR文件、傳遞參數(shù)與性能調(diào)優(yōu)

    java?-jar命令詳解之運(yùn)行JAR文件、傳遞參數(shù)與性能調(diào)優(yōu)

    這篇文章主要介紹了java?-jar命令詳解之運(yùn)行JAR文件、傳遞參數(shù)與性能調(diào)優(yōu)的相關(guān)資料,java?-jar命令用于運(yùn)行可執(zhí)行的JAR文件,它解析JAR文件中的META-INF/MANIFEST.MF文件來確定主類,并執(zhí)行該類的?main方法,運(yùn)行時(shí)可通過參數(shù)傳遞給主類,需要的朋友可以參考下
    2025-04-04
  • SpringBoot+MyBatisPlus對(duì)Map中Date格式轉(zhuǎn)換處理的方法詳解

    SpringBoot+MyBatisPlus對(duì)Map中Date格式轉(zhuǎn)換處理的方法詳解

    在?SpringBoot?項(xiàng)目中,?如何統(tǒng)一?JSON?格式化中的日期格式。本文將為大家介紹一種方法:利用MyBatisPlus實(shí)現(xiàn)對(duì)Map中Date格式轉(zhuǎn)換處理,需要的可以參考一下
    2022-10-10
  • java后臺(tái)驗(yàn)證碼生成的實(shí)現(xiàn)方法

    java后臺(tái)驗(yàn)證碼生成的實(shí)現(xiàn)方法

    在我們使用進(jìn)行系統(tǒng)開發(fā)時(shí),為了提高系統(tǒng)的安全性,在登錄的時(shí)候多數(shù)人都會(huì)要求輸入驗(yàn)證,本文介紹了java后臺(tái)驗(yàn)證碼生成的實(shí)現(xiàn)方法,感興趣的一起來了解一下
    2021-05-05
  • SpringBoot自定義maven-plugin插件整合asm代碼插樁

    SpringBoot自定義maven-plugin插件整合asm代碼插樁

    本文主要介紹了SpringBoot自定義maven-plugin插件整合asm代碼插樁,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • ssm框架上傳圖片保存到本地和數(shù)據(jù)庫示例

    ssm框架上傳圖片保存到本地和數(shù)據(jù)庫示例

    本篇文章主要介紹了ssm框架上傳圖片保存到本地和數(shù)據(jù)庫示例,主要使用了Spring+SpringMVC+MyBatis框架集合,有興趣的可以了解一下。
    2017-03-03
  • Spring boot整合shiro+jwt實(shí)現(xiàn)前后端分離

    Spring boot整合shiro+jwt實(shí)現(xiàn)前后端分離

    這篇文章主要為大家詳細(xì)介紹了Spring boot整合shiro+jwt實(shí)現(xiàn)前后端分離,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 一起來看看springboot集成redis的使用注解

    一起來看看springboot集成redis的使用注解

    這篇文章主要為大家詳細(xì)介紹了springboot集成redis的使用注解,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • SpringBoot與MyBatis-Plus的高效集成方式

    SpringBoot與MyBatis-Plus的高效集成方式

    本文詳細(xì)介紹了如何在SpringBoot項(xiàng)目中整合MyBatis-Plus,包括環(huán)境準(zhǔn)備、實(shí)體類與Mapper接口定義、CRUD操作、條件構(gòu)造器、事務(wù)管理、安全性考慮、性能優(yōu)化、版本兼容性與遷移、實(shí)際應(yīng)用場景和監(jiān)控與日志等內(nèi)容,通過這些步驟,讀者可以掌握MyBatis-Plus的高級(jí)特性和最佳實(shí)踐
    2024-11-11
  • 利用MultipartFile實(shí)現(xiàn)文件上傳功能

    利用MultipartFile實(shí)現(xiàn)文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了利用MultipartFile實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評(píng)論

景泰县| 扎鲁特旗| 绥芬河市| 云南省| 赤城县| 朝阳县| 石家庄市| 阿荣旗| 顺平县| 大埔区| 伊金霍洛旗| 洛阳市| 六枝特区| 灵川县| 墨竹工卡县| 班玛县| 定南县| 伊春市| 获嘉县| 浦县| 哈密市| 阿荣旗| 石渠县| 涪陵区| 浙江省| 静海县| 内江市| 东明县| 郸城县| 焦作市| 任丘市| 伊宁市| 兰州市| 大余县| 广河县| 永善县| 缙云县| 皋兰县| 杭锦后旗| 云南省| 双辽市|