国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

深入淺出設(shè)計(jì)模式 - 裝飾者模式

這篇具有很好參考價(jià)值的文章主要介紹了深入淺出設(shè)計(jì)模式 - 裝飾者模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

博主介紹: ?博主從事應(yīng)用安全和大數(shù)據(jù)領(lǐng)域,有8年研發(fā)經(jīng)驗(yàn),5年面試官經(jīng)驗(yàn),Java技術(shù)專家?

Java知識(shí)圖譜點(diǎn)擊鏈接:體系化學(xué)習(xí)Java(Java面試專題)

???? 感興趣的同學(xué)可以收藏關(guān)注下 ,不然下次找不到喲????

深入淺出設(shè)計(jì)模式 - 裝飾者模式

1、什么是裝飾者模式

裝飾者模式(Decorator Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許你向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。裝飾者模式基于組合而非繼承的原則,它動(dòng)態(tài)地將責(zé)任附加到對(duì)象上。

裝飾者模式涉及到四個(gè)角色:抽象組件、具體組件、抽象裝飾者和具體裝飾者。其中,抽象組件定義了組件的基本功能,具體組件實(shí)現(xiàn)了組件的基本功能,抽象裝飾者定義了裝飾者的基本功能,具體裝飾者實(shí)現(xiàn)了裝飾者的基本功能,并且可以添加額外的功能。

裝飾者模式的優(yōu)點(diǎn)是可以動(dòng)態(tài)地添加或刪除對(duì)象的功能,而不需要修改現(xiàn)有的代碼。它還可以避免使用子類來(lái)擴(kuò)展對(duì)象的功能,從而減少類的數(shù)量。缺點(diǎn)是裝飾者模式會(huì)增加許多小對(duì)象,從而增加系統(tǒng)的復(fù)雜性。

2、裝飾者模式的優(yōu)缺點(diǎn)

裝飾者模式的優(yōu)點(diǎn)包括:

  1. 可以動(dòng)態(tài)地添加或刪除對(duì)象的功能,而不需要修改現(xiàn)有的代碼。

  2. 可以避免使用子類來(lái)擴(kuò)展對(duì)象的功能,從而減少類的數(shù)量。

  3. 可以將多個(gè)裝飾者組合起來(lái),實(shí)現(xiàn)更復(fù)雜的功能。

裝飾者模式的缺點(diǎn)包括:

  1. 裝飾者模式會(huì)增加許多小對(duì)象,從而增加系統(tǒng)的復(fù)雜性。

  2. 裝飾者模式可能會(huì)導(dǎo)致設(shè)計(jì)變得過(guò)于抽象,從而難以理解和維護(hù)。

  3. 裝飾者模式可能會(huì)影響程序的性能,因?yàn)槊總€(gè)裝飾者都會(huì)增加額外的處理時(shí)間。

3、裝飾者模式的應(yīng)用場(chǎng)景

裝飾者模式通常適用于以下場(chǎng)景:

  1. 在不影響現(xiàn)有對(duì)象結(jié)構(gòu)的情況下,動(dòng)態(tài)地添加額外的功能或行為。

  2. 需要擴(kuò)展一個(gè)類的功能,但是使用繼承會(huì)導(dǎo)致類的數(shù)量增加,且不利于維護(hù)。

  3. 需要在不修改代碼的情況下,對(duì)對(duì)象的某些功能進(jìn)行組合或移除。

  4. 需要對(duì)一個(gè)對(duì)象的功能進(jìn)行多次擴(kuò)展或組合,而不是一次性地進(jìn)行全部擴(kuò)展或組合。

  5. 需要在運(yùn)行時(shí)動(dòng)態(tài)地添加或刪除對(duì)象的功能。

  6. 需要在不破壞封裝性的前提下,對(duì)對(duì)象的功能進(jìn)行擴(kuò)展或修改。

  7. 需要對(duì)對(duì)象的功能進(jìn)行動(dòng)態(tài)排序或過(guò)濾。

  8. 需要對(duì)對(duì)象的功能進(jìn)行動(dòng)態(tài)配置或組合。

總之,裝飾者模式適用于需要?jiǎng)討B(tài)地添加或刪除對(duì)象的功能,同時(shí)又不希望對(duì)現(xiàn)有對(duì)象結(jié)構(gòu)進(jìn)行修改的場(chǎng)景。

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

裝飾者模式的結(jié)構(gòu)包括以下組件:

  1. 抽象組件(Component):定義了組件的接口,可以是抽象類或接口。

  2. 具體組件(Concrete Component):實(shí)現(xiàn)了抽象組件的接口,提供了基本的功能。

  3. 抽象裝飾者(Decorator):定義了裝飾者的接口,包含一個(gè)指向抽象組件的引用。

  4. 具體裝飾者(Concrete Decorator):實(shí)現(xiàn)了抽象裝飾者的接口,對(duì)抽象組件添加了新的功能。

裝飾者模式使用組合而非繼承的方式,動(dòng)態(tài)地將責(zé)任附加到對(duì)象上,從而實(shí)現(xiàn)了動(dòng)態(tài)地?cái)U(kuò)展對(duì)象的功能。它可以在不修改現(xiàn)有代碼的情況下,動(dòng)態(tài)地添加或刪除對(duì)象的功能,同時(shí)避免了使用子類來(lái)擴(kuò)展對(duì)象的功能,從而減少了類的數(shù)量。

5、裝飾者模式的代碼案例

假設(shè)有一個(gè)飲料類(Beverage),它有一個(gè)描述(description)和一個(gè)計(jì)算價(jià)格(cost)的方法?,F(xiàn)在需要給這個(gè)飲料類添加一些調(diào)料(Condiment),比如牛奶、摩卡等,這些調(diào)料也有自己的描述和價(jià)格。使用裝飾者模式,可以動(dòng)態(tài)地添加或刪除調(diào)料,而不需要修改飲料類的代碼。

首先,我們定義一個(gè)飲料類Beverage,它是一個(gè)抽象類,包含描述和計(jì)算價(jià)格兩個(gè)方法:

package com.pany.camp.design.principle.decorators;

/**
 *
 * @description: 抽象類
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-27 20:37
 */
public abstract class Beverage {
    String description = "Unknown Beverage";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

然后,我們定義一個(gè)具體的飲料類Espresso,它繼承自Beverage類,實(shí)現(xiàn)了cost方法和description屬性:

package com.pany.camp.design.principle.decorators;

/**
 *
 * @description:  抽象實(shí)現(xiàn)
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 20:38
 */
public class Espresso extends Beverage {
    public Espresso() {
        description = "Espresso";
    }
    public double cost() {
        return 1.99;
    }
}

接下來(lái),我們定義一個(gè)抽象的調(diào)料類CondimentDecorator,它也是一個(gè)抽象類,繼承自Beverage類,包含一個(gè)抽象的getDescription方法:

package com.pany.camp.design.principle.decorators;

/**
 *
 * @description:  抽象的調(diào)料類
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 20:38
 */
public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
}

然后,我們定義一個(gè)具體的調(diào)料類Milk,它繼承自CondimentDecorator類,包含一個(gè)Beverage類型的成員變量和一個(gè)構(gòu)造方法,用于接收一個(gè)飲料對(duì)象,然后將其保存到成員變量中。getDescription方法會(huì)調(diào)用Beverage對(duì)象的getDescription方法,并在其后面添加", Milk"。cost方法會(huì)調(diào)用Beverage對(duì)象的cost方法,并加上0.10的價(jià)格:

package com.pany.camp.design.principle.decorators;

/**
 *
 * @description:  具體的調(diào)料類Milk
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 20:39
 */
public class Milk extends CondimentDecorator {
    Beverage beverage;

    public Milk(Beverage beverage) {
        this.beverage = beverage;
    }

    public String getDescription() {
        return beverage.getDescription() + ", Milk";
    }

    public double cost() {
        return beverage.cost() + 0.10;
    }
}

類似地,我們定義另一個(gè)具體的調(diào)料類Mocha,它也繼承自CondimentDecorator類,包含一個(gè)Beverage類型的成員變量和一個(gè)構(gòu)造方法,用于接收一個(gè)飲料對(duì)象,然后將其保存到成員變量中。getDescription方法會(huì)調(diào)用Beverage對(duì)象的getDescription方法,并在其后面添加", Mocha"。cost方法會(huì)調(diào)用Beverage對(duì)象的cost方法,并加上0.20的價(jià)格:

package com.pany.camp.design.principle.decorators;

/**
 *
 * @description:  具體的調(diào)料類Mocha
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 20:40 
 */
public class Mocha extends CondimentDecorator {
    Beverage beverage;

    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

    public String getDescription() {
        return beverage.getDescription() + ", Mocha";
    }

    public double cost() {
        return beverage.cost() + 0.20;
    }
}

最后,我們可以使用如下的測(cè)試代碼來(lái)測(cè)試我們的裝飾者模式:

package com.pany.camp.design.principle.decorators;

/**
 * @description: 客戶端
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-27 20:40
 */
public class Client {

    public static void main(String[] args) {
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription() + " $" + beverage.cost());
        beverage = new Milk(beverage);
        System.out.println(beverage.getDescription() + " $" + beverage.cost());
        beverage = new Mocha(beverage);
        System.out.println(beverage.getDescription() + " $" + beverage.cost());
    }
}

輸出結(jié)果為:

Espresso $1.99
Espresso, Milk $2.09
Espresso, Milk, Mocha $2.29

Process finished with exit code 0

可以看到,通過(guò)裝飾者模式,我們動(dòng)態(tài)地給飲料類添加了調(diào)料,而不需要修改飲料類的代碼。
深入淺出設(shè)計(jì)模式 - 裝飾者模式

???? 本文由激流原創(chuàng),首發(fā)于CSDN博客,博客主頁(yè) https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421
????喜歡的話記得點(diǎn)贊收藏啊
深入淺出設(shè)計(jì)模式 - 裝飾者模式文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-503608.html

到了這里,關(guān)于深入淺出設(shè)計(jì)模式 - 裝飾者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 《深入淺出.NET框架設(shè)計(jì)與實(shí)現(xiàn)》筆記1——.NET CLI 概述

    .NET CLI(NET 命令行接口)工具是用于開(kāi)發(fā)生成運(yùn)行和發(fā)布.NET應(yīng)用程序的跨平臺(tái)工具鏈。 默認(rèn)安裝的命令有 1、基本命令 2、項(xiàng)目修改命令 3、高級(jí)命令 4、工具管理命令 工具三控制臺(tái)應(yīng)用程序,它們從NuGet包中安裝并從命令提示符處進(jìn)行調(diào)用。 CLI命令結(jié)構(gòu)包 含驅(qū)動(dòng)程序(“

    2024年04月22日
    瀏覽(16)
  • 【動(dòng)手學(xué)深度學(xué)習(xí)】深入淺出深度學(xué)習(xí)之RMSProp算法的設(shè)計(jì)與實(shí)現(xiàn)

    【動(dòng)手學(xué)深度學(xué)習(xí)】深入淺出深度學(xué)習(xí)之RMSProp算法的設(shè)計(jì)與實(shí)現(xiàn)

    目錄 ??一、實(shí)驗(yàn)?zāi)康???二、實(shí)驗(yàn)準(zhǔn)備 ??三、實(shí)驗(yàn)內(nèi)容 ??1. 認(rèn)識(shí)RMSProp算法 ??2. 在optimizer_compare_naive.py中加入RMSProp ??3. 在optimizer_compare_mnist.py中加入RMSProp ??4.?問(wèn)題的解決 ??四、實(shí)驗(yàn)心得 深入學(xué)習(xí)RMSProp算法的原理和工作機(jī)制; 根據(jù)RMSProp算法的原理,設(shè)計(jì)并實(shí)現(xiàn)一個(gè)

    2024年04月10日
    瀏覽(32)
  • 設(shè)計(jì)模式——裝飾器模式

    設(shè)計(jì)模式——裝飾器模式

    裝飾器模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個(gè)包裝。 裝飾器模式通過(guò)將對(duì)象包裝在裝飾器類中,以便動(dòng)態(tài)地修改其行為。 這種模式創(chuàng)建了一個(gè)裝飾類,用來(lái)包裝原有的

    2024年02月10日
    瀏覽(25)
  • 設(shè)計(jì)模式-裝飾器模式

    設(shè)計(jì)模式-裝飾器模式

    裝飾者模式的定義為:動(dòng)態(tài)的給一個(gè)對(duì)象添加其它功能。 從擴(kuò)展性來(lái)說(shuō),這種方式比繼承更有彈性,更加靈活,裝飾者模式也體現(xiàn)了開(kāi)閉原則(OCP)。 星巴克咖啡訂單項(xiàng)目(咖啡館) : 1)咖啡種類/單品咖啡: Espresso(意大利濃咖啡)、ShortBlack、Decaf(無(wú)因咖啡)、LongBlack(美式咖啡) 2)

    2024年02月06日
    瀏覽(23)
  • 設(shè)計(jì)模式--裝飾者模式

    設(shè)計(jì)模式--裝飾者模式

    (1) 可樂(lè)種類/單品可樂(lè) :BaiShiCola(百事可樂(lè)) FeiChangCola(非常可樂(lè)) CoCola(可口可樂(lè)) (2) 調(diào)料/附品: Milk? Chocolate (3) 要求在擴(kuò)展新的可樂(lè)種類時(shí) 要具有良好的擴(kuò)展性 改動(dòng)方便 維護(hù)方便 (4) 使用OO的來(lái)就算不同之類可樂(lè)的費(fèi)用 客戶可以點(diǎn)單品可樂(lè) 也可以單品可樂(lè)+調(diào)料組合 方案1?

    2024年02月02日
    瀏覽(20)
  • 設(shè)計(jì)模式(3)裝飾模式

    設(shè)計(jì)模式(3)裝飾模式

    一、介紹: 1、應(yīng)用場(chǎng)景:把所需的功能按正確的順序串聯(lián)起來(lái)進(jìn)行控制。動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé),就增加功能來(lái)說(shuō),裝飾模式比生成子類更加靈活。 當(dāng)需要給一個(gè)現(xiàn)有類添加附加職責(zé),而又不能采用生成子類的方法進(jìn)行擴(kuò)充時(shí)。例如,該類被隱藏或者該類是

    2024年02月13日
    瀏覽(31)
  • 【設(shè)計(jì)模式】-裝飾器模式

    在軟件開(kāi)發(fā)中,經(jīng)常有需求對(duì)已有的對(duì)象進(jìn)行功能的擴(kuò)展,但是傳統(tǒng)的繼承方式會(huì)導(dǎo)致類的數(shù)量快速增多,且難以維護(hù)。為了解決這個(gè)問(wèn)題,裝飾器模式應(yīng)運(yùn)而生。 裝飾器模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它可以在運(yùn)行時(shí)動(dòng)態(tài)地將新的行為附加到對(duì)象上,而不改變其結(jié)構(gòu)。這種方

    2024年02月14日
    瀏覽(18)
  • 設(shè)計(jì)模式——裝飾者模式

    設(shè)計(jì)模式——裝飾者模式

    更多內(nèi)容,前往 IT-BLOG 現(xiàn)實(shí)生活中常常需要給某類產(chǎn)品動(dòng)態(tài)增加新的功能,如:給面條各種調(diào)味品。在軟件開(kāi)發(fā)過(guò)程中,有時(shí)想用一些現(xiàn)存的組件。這些組件可能只是完成一些核心功能。但在不改變其架構(gòu)的情況下,可以動(dòng)態(tài)地?cái)U(kuò)展其功能。所以這些都可以采用裝飾模式來(lái)實(shí)

    2024年02月22日
    瀏覽(17)
  • 【設(shè)計(jì)模式】裝飾器模式

    【設(shè)計(jì)模式】裝飾器模式

    裝飾器模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個(gè)包裝。 裝飾器模式通過(guò)將對(duì)象包裝在裝飾器類中,以便動(dòng)態(tài)地修改其行為。 這種模式創(chuàng)建了一個(gè)裝飾類,用來(lái)包裝原有的

    2024年02月13日
    瀏覽(19)
  • Java設(shè)計(jì)模式-裝飾模式

    裝飾模式在Java領(lǐng)域是一種常見(jiàn)的設(shè)計(jì)模式,它能夠在不改變對(duì)象原有結(jié)構(gòu)的情況下,動(dòng)態(tài)地為對(duì)象添加新的功能。它通過(guò)封裝原有對(duì)象,在運(yùn)行時(shí)動(dòng)態(tài)地為對(duì)象添加新的行為或者修改原有行為,以擴(kuò)展對(duì)象的功能。這種方式避免了繼承的靜態(tài)特性,讓對(duì)象的行為可以根據(jù)需要

    2024年02月04日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包