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

Java設(shè)計模式中裝飾者模式應(yīng)用詳解

 更新時間:2022年11月25日 16:31:05   作者:lpf_wei  
裝飾者模式:在不改變原有對象的基礎(chǔ)之上,動態(tài)的將功能附加到對象上,提供了繼承更有彈性的替代方案,也體現(xiàn)了開閉原則。本文將通過示例詳細(xì)講解一下裝飾者模式,需要的可以參考一下

編程是一門藝術(shù),大批量的改動顯然是非常丑陋的做法,用心的琢磨寫的代碼讓它變的更美觀。

在現(xiàn)實生活中,常常需要對現(xiàn)有產(chǎn)品增加新的功能或美化其外觀,如房子裝修、相片加相框等,都是裝飾器模式。

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

1.裝飾器模式(Decorator)的定義

裝飾器模式:是指在不改變現(xiàn)有對象結(jié)構(gòu)的情況下,動態(tài)地給該對象增加一些職責(zé)(即增加其額外功能)的模式,它屬于對象結(jié)構(gòu)型模式。

2.裝飾者設(shè)計模式的優(yōu)點(diǎn)與不足

裝飾者設(shè)計模式優(yōu)點(diǎn):

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

其主要缺點(diǎn)是:裝飾器模式會增加許多子類,過度使用會增加程序得復(fù)雜性。

3.裝飾器模式的實現(xiàn)思路

通常情況下,擴(kuò)展一個類的功能會使用繼承方式來實現(xiàn)。但繼承具有靜態(tài)特征,耦合度高,并且隨著擴(kuò)展功能的增多,子類會很膨脹。如果使用組合關(guān)系來創(chuàng)建一個包裝對象(即裝飾對象)來包裹真實對象,并在保持真實對象的類結(jié)構(gòu)不變的前提下,為其提供額外的功能,這就是裝飾器模式的目標(biāo)。

4.裝飾者代碼示例

實例場景介紹:采摘水果,然后進(jìn)行包裝,這是主流程,然后需要對包裝進(jìn)行功能增強(qiáng),比如:增加防偽標(biāo)識、長途加固、標(biāo)記加急。

/**
 * 包裝接口
 */
public interface Bag {
    void pack();
}
/**
 * 這個是裝飾者的基類
 */
public abstract class BagDecorator implements Bag {
    /**
     * 維持一個對 抽象構(gòu)件對象的引用
     * 這個是想要增強(qiáng)的功能對象 將想要增強(qiáng)的功能對象傳進(jìn)來,然后才能進(jìn)行功能增強(qiáng)
     */
    private Bag bag;
    /**
     * 注入一個抽象構(gòu)件類型的對象
     * 將之前的對象傳遞進(jìn)來,進(jìn)行功能增強(qiáng)
     * @param bag
     */
    public BagDecorator(Bag bag) {
        this.bag = bag;
    }
    @Override
    public void pack() {
        bag.pack();
    }
}
/**
 * 增加防偽標(biāo)識
 */
public class CheckedBagDecorator extends BagDecorator{
    public CheckedBagDecorator(Bag bag) {
        super(bag);
    }
    @Override
    public void pack() {
        super.pack();  
        checked();   
    }
    public void checked() {
        System.out.println("打印上防偽標(biāo)識");
    }
}
/**
 * 加固增強(qiáng)
 */
public class ReinforceBagDecorator extends BagDecorator {
    public ReinforceBagDecorator(Bag bag) {
        super(bag);
    }
    public void pack() {
        super.pack();   
        reinforce();
    }
    public void reinforce() {
        System.out.println("加固了包裝");
    }
}
/**
 * 加急功能增強(qiáng)
 */
public class SpeedDecorator extends BagDecorator {
    public SpeedDecorator(Bag bag) {
        super(bag);
    }
    @Override
    public void pack() {
        super.pack();
        speedy();
    }
    public void speedy() {
        System.out.println("打上加急標(biāo)識");
    }
}
   public static void main(String[] args){
        AbstractFactory factory = new AppleFactory();
        /*得到水果*/
        Fruit fruit = factory.getFruit();
        fruit.draw();
        /*得到包裝*/
        Bag bag = factory.getBag();
        /*下面是對包裝進(jìn)行裝飾的過程(也就是功能增強(qiáng)的過程)*/
        /*現(xiàn)需要增加防偽標(biāo)識*/
        bag = new CheckedBagDecorator(bag);
        /*加固功能*/
        bag = new ReinforceBagDecorator(bag);
        /*加急功能*/
        bag = new SpeedDecorator(bag);
        bag.pack();
    }

BagDecorator:功能增強(qiáng)基類,實現(xiàn)了待增強(qiáng)功能的行為接口,并持有一個包裝接口成員變量,這個變量通過構(gòu)造方法注入進(jìn)來,這個成員變量就是上一個增強(qiáng)之后的結(jié)果,一定要在上一個增強(qiáng)的結(jié)果之上進(jìn)行功能增強(qiáng),否則,就將之前的功能丟失了,所以這個成員變量很關(guān)鍵。

還有就是每次進(jìn)行包裝pack的時候,一定要先調(diào)用super方法,先之前之前的包裝,然后再進(jìn)行增強(qiáng)。

5.裝飾器模式的應(yīng)用場景

裝飾器模式通常在以下幾種情況使用:

  • 當(dāng)需要給一個現(xiàn)有類添加附加職責(zé),而又不能采用生成子類的方法進(jìn)行擴(kuò)充時。例如,該類被隱藏或者該類是終極類或者采用繼承方式會產(chǎn)生大量的子類。
  • 當(dāng)需要通過對現(xiàn)有的一組基本功能進(jìn)行排列組合而產(chǎn)生非常多的功能時,采用繼承關(guān)系很難實現(xiàn),而采用裝飾器模式卻很好實現(xiàn)。
  • 當(dāng)對象的功能要求可以動態(tài)地添加,也可以再動態(tài)地撤銷時。

裝飾者設(shè)計模式,在Java中非常經(jīng)典的例子是:

InputStream 的子類 FilterInputStream,OutputStream 的子類 FilterOutputStream,Reader 的子類 BufferedReader 以及 FilterReader,還有 Writer 的子類 BufferedWriter、FilterWriter 以及 PrintWriter 等,它們都是抽象裝飾類。

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

相關(guān)文章

  • 使用maven插件對java工程進(jìn)行打包過程解析

    使用maven插件對java工程進(jìn)行打包過程解析

    這篇文章主要介紹了使用maven插件對java工程進(jìn)行打包過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • mybatis報Query?was?Empty異常的問題

    mybatis報Query?was?Empty異常的問題

    這篇文章主要介紹了mybatis報Query?was?Empty異常的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java去除字符串中的空格、回車、換行符、制表符的小例子

    java去除字符串中的空格、回車、換行符、制表符的小例子

    java去除字符串中的空格、回車、換行符、制表符的小例子,需要的朋友可以參考一下
    2013-06-06
  • Arrays.sort如何實現(xiàn)降序排序

    Arrays.sort如何實現(xiàn)降序排序

    這篇文章主要介紹了Arrays.sort如何實現(xiàn)降序排序問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java代碼塊與代碼加載順序原理詳解

    Java代碼塊與代碼加載順序原理詳解

    這篇文章主要介紹了Java代碼塊與代碼加載順序原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Java并發(fā)之異步的八種實現(xiàn)方式

    Java并發(fā)之異步的八種實現(xiàn)方式

    本文主要介紹了Java并發(fā)之異步的八種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 使用BigDecimal除法后保留兩位小數(shù)

    使用BigDecimal除法后保留兩位小數(shù)

    這篇文章主要介紹了使用BigDecimal除法后保留兩位小數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Sharding-jdbc報錯:Missing the data source name:‘m0‘解決方案

    Sharding-jdbc報錯:Missing the data source 

    在使用MyBatis-plus進(jìn)行數(shù)據(jù)操作時,新增Order實體屬性后,出現(xiàn)了數(shù)據(jù)源缺失的提示錯誤,原因是因為userId屬性值使用了隨機(jī)函數(shù)生成的Long值,這與sharding-jdbc的路由規(guī)則計算不匹配,導(dǎo)致無法找到正確的數(shù)據(jù)源,通過調(diào)整userId生成邏輯
    2024-11-11
  • Linux 下通過 java 命令啟動 jar 包常見方式小結(jié)

    Linux 下通過 java 命令啟動 jar 包常見方式小結(jié)

    這篇文章主要介紹了Linux 下通過 java 命令啟動 jar 包常見方式小結(jié),后臺啟動jar包命令大致有五種,每種方式結(jié)合代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2023-12-12
  • java 內(nèi)部類(匿名類,匿名對象,靜態(tài)內(nèi)部類)詳解及實例

    java 內(nèi)部類(匿名類,匿名對象,靜態(tài)內(nèi)部類)詳解及實例

    這篇文章主要介紹了java 內(nèi)部類詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-12-12

最新評論

双辽市| 翁源县| 南宫市| 泌阳县| 龙胜| 同心县| 乐都县| 保亭| 朝阳县| 左云县| 南投县| 汶上县| 象州县| 佳木斯市| 焦作市| 浮梁县| 棋牌| 县级市| 平陆县| 宝兴县| 佛学| 大余县| 潮安县| 吉木萨尔县| 长子县| 江津市| 宾川县| 盐池县| 尼玛县| 酒泉市| 界首市| 瓮安县| 巴中市| 松原市| 白银市| 肃宁县| 乡宁县| 丰顺县| 大理市| 建始县| 德清县|