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

Java結(jié)構(gòu)性設(shè)計(jì)模式中的裝飾器模式介紹使用

 更新時(shí)間:2022年09月22日 14:12:04   作者:丨Jack_Chen丨  
裝飾器模式又名包裝(Wrapper)模式。裝飾器模式以對(duì)客戶端透明的方式拓展對(duì)象的功能,是繼承關(guān)系的一種替代方案,本篇文章以虹貓藍(lán)兔生動(dòng)形象的為你帶來(lái)詳細(xì)講解

裝飾器模式

概述

裝飾器模式(Decorator Pattern)也稱為包裝模式(Wrapper Pattern),屬于結(jié)構(gòu)型模式。

它是指在不改變?cè)袑?duì)象的基礎(chǔ)之上,允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu),作為現(xiàn)有的類的一個(gè)包裝。

這種模式創(chuàng)建一個(gè)裝飾類,用來(lái)包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。

提供了比繼承更有單性的替代方案,進(jìn)行擴(kuò)展原有對(duì)象的功能。

裝飾器模式的核心是功能擴(kuò)展。使用裝飾器模式可以透明且動(dòng)態(tài)地?cái)U(kuò)展類的功能。

裝飾器模式主要用于誘明且動(dòng)態(tài)地?cái)U(kuò)展類的功能。

實(shí)現(xiàn)原理

讓裝飾器實(shí)現(xiàn)被包裝類相同的接口,使得裝飾器與被擴(kuò)展類類型一致,并在構(gòu)造函數(shù)中傳入該接口對(duì)象,然后就可以在接口需要實(shí)現(xiàn)的方法中在被包裝類對(duì)象的現(xiàn)有功能上添加新功能。

由于裝飾器與被包裝類屬于同一類型,且構(gòu)造函數(shù)的參數(shù)為其實(shí)現(xiàn)接口類,因此裝飾器模式具備嵌套擴(kuò)展功能,因此就能使用裝飾器模式一層層的對(duì)最底層被包裝類進(jìn)行功能擴(kuò)展。

在JDK中,IO相關(guān)包下大量使用裝飾器模式,如BufferedReader、InputStream、OutputStream等類

主要角色

裝飾器模式主要包含4種角色

1.抽象組件(Component)

抽象組件可以是一個(gè)接口或者抽象類,其充當(dāng)被裝飾類的原始對(duì)象,規(guī)定了被裝飾對(duì)象的行為。

2.具體組件(ConcreteComponent)

具體組件實(shí)現(xiàn)/繼承抽象組件的一個(gè)具體對(duì)象,即被裝飾對(duì)象。

3.抽象裝飾器(Decorator)

通用的裝飾具體組件的裝飾器,其內(nèi)部必然有一個(gè)屬性指向抽象組件;其實(shí)現(xiàn)一般是一個(gè)抽象類,主要是為了讓其子類按照其構(gòu)造形式傳入一個(gè)抽象組件,這是強(qiáng)制的通用行為。

如果系統(tǒng)中裝飾邏輯單一,并不需要實(shí)現(xiàn)許多裝飾器,那么可以直接省略該類,而直接實(shí)現(xiàn)一個(gè)具體裝飾器即可。

4.具體裝飾器(ConcreteDecorator)

抽象裝飾器的具體實(shí)現(xiàn)類,理論上,每個(gè)具體組件都擴(kuò)展了抽象組件對(duì)象的一種功能。

應(yīng)用場(chǎng)景

1.用于擴(kuò)展一個(gè)類的功能或給一個(gè)類添加附加職責(zé)。

2.動(dòng)態(tài)的給一個(gè)對(duì)象添加功能,這些功能可以再動(dòng)態(tài)的澈銷。

3.需要為一批的兄弟類進(jìn)行改裝或加裝功能。

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

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

1.裝飾器是繼承的補(bǔ)充,比繼承靈活,不改變?cè)袑?duì)象的情況下動(dòng)態(tài)地給一個(gè)對(duì)象擴(kuò)展功能,即插即用。

2.裝飾器完全遵守開(kāi)閉原則。

缺點(diǎn):

1.會(huì)出現(xiàn)更多的代碼,更多的類,增加程序復(fù)雜性。

2.通過(guò)使用不同裝飾類以及這些裝飾類的排列組合,可以實(shí)現(xiàn)不同效果。

3.動(dòng)態(tài)裝飾時(shí),多層裝飾時(shí)會(huì)更復(fù)雜。

裝飾器模式的基本使用

創(chuàng)建抽象組件

創(chuàng)建Phone抽象類

public abstract class Phone {
    public abstract String call();
    public abstract double price();
}

具體組件

創(chuàng)建最基本具有打電話功能的手機(jī)

public class BasePhone extends Phone {
    @Override
    public String call() {
     return "BasePhone call";
    }
    @Override
    public double price() {
        return 0.1;
    }
}

抽象裝飾器

創(chuàng)建一個(gè)抽象裝飾器來(lái)擴(kuò)展該只具備基本功能的手機(jī)

public abstract class PhoneDecorator extends Phone {
    private Phone phone;
    public PhoneDecorator(Phone phone) {
        this.phone = phone;
    }
    @Override
    public String call() {
        return phone.call();
    }
    @Override
    public double price() {
        return phone.price();
    }
    /**
     * 擴(kuò)展功能
     */
    public abstract void sendMsg();
}

具體裝飾器

public class SatellitePhoneDecorator extends PhoneDecorator{
    public SatellitePhoneDecorator(Phone phone) {
        super(phone);
    }
    public void sendMsg() {
        System.out.println("PhoneCallDecorator sendMsg");
    }
    @Override
    public String call() {
        return  "SatellitePhone call";
    }
    @Override
    public double price() {
        return super.price()+100;
    }
}

客戶端調(diào)用

    public static void main(String[] args) {
        // 創(chuàng)建需要被裝飾的原始對(duì)象(即要被裝飾的對(duì)象)
        Phone phone = new BasePhone();
        System.out.println("使用: "+phone.call()+" 方式打電話,每分鐘單價(jià):" + phone.price());
        // 給對(duì)象透明的增加額外功能并調(diào)用
        PhoneDecorator phoneDecorator = new SatellitePhoneDecorator(phone);
        System.out.println("使用: "+phoneDecorator.call()+" 方式打電話,每分鐘單價(jià):" + phoneDecorator.price());
        // 裝飾器也可以裝飾具體的裝飾對(duì)象,相當(dāng)于給對(duì)象在增加的功能基礎(chǔ)上在添加功能,這里體現(xiàn)在單價(jià)100.1基礎(chǔ)上再+100
        PhoneDecorator satellitePhoneDecorator = new SatellitePhoneDecorator(phoneDecorator);
        System.out.println("使用: "+satellitePhoneDecorator.call()+" 方式打電話,每分鐘單價(jià):" + satellitePhoneDecorator.price());
        satellitePhoneDecorator.sendMsg();
    }

使用: BasePhone call 方式打電話,每分鐘單價(jià):0.1
使用: SatellitePhone call 方式打電話,每分鐘單價(jià):100.1
使用: SatellitePhone call 方式打電話,每分鐘單價(jià):200.1
PhoneCallDecorator sendMsg

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

相關(guān)文章

  • 詳解Java二叉排序樹(shù)

    詳解Java二叉排序樹(shù)

    這篇文章主要介紹了Java二叉排序樹(shù),包括二叉排序樹(shù)的定義、二叉排序樹(shù)的性質(zhì)、二叉排序樹(shù)的插入和查找等,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Java解決xss轉(zhuǎn)義導(dǎo)致轉(zhuǎn)碼的問(wèn)題

    Java解決xss轉(zhuǎn)義導(dǎo)致轉(zhuǎn)碼的問(wèn)題

    跨站腳本攻擊XSS是最普遍的Web應(yīng)用安全漏洞,本文主要介紹了Java解決xss轉(zhuǎn)義導(dǎo)致轉(zhuǎn)碼的問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • SpringBoot結(jié)合JWT實(shí)現(xiàn)用戶登錄、注冊(cè)、鑒權(quán)

    SpringBoot結(jié)合JWT實(shí)現(xiàn)用戶登錄、注冊(cè)、鑒權(quán)

    用戶登錄、注冊(cè)及鑒權(quán)是我們基本所有系統(tǒng)必備的,也是很核心重要的一塊,本文主要介紹了SpringBoot結(jié)合JWT實(shí)現(xiàn)用戶登錄、注冊(cè)、鑒權(quán),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-05-05
  • 完美解決SpringCloud-OpenFeign使用okhttp替換不生效問(wèn)題

    完美解決SpringCloud-OpenFeign使用okhttp替換不生效問(wèn)題

    這篇文章主要介紹了完美解決SpringCloud-OpenFeign使用okhttp替換不生效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java兩大工具庫(kù)Commons和Guava使用示例詳解

    Java兩大工具庫(kù)Commons和Guava使用示例詳解

    這篇文章主要為大家介紹了Java兩大工具庫(kù)Commons和Guava使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 實(shí)例講解分布式緩存軟件Memcached的Java客戶端使用

    實(shí)例講解分布式緩存軟件Memcached的Java客戶端使用

    這篇文章主要介紹了分布式緩存軟件Memcached的Java客戶端使用,Memcached在GitHub上開(kāi)源,作者用其Windows平臺(tái)下的版本進(jìn)行演示,需要的朋友可以參考下
    2016-01-01
  • Spring AOP注解實(shí)戰(zhàn)指南

    Spring AOP注解實(shí)戰(zhàn)指南

    在現(xiàn)代軟件開(kāi)發(fā)中,面向切面編程(AOP)是一種強(qiáng)大的編程范式,本文將介紹如何在Spring框架中通過(guò)AspectJ注解以及對(duì)應(yīng)的XML配置來(lái)實(shí)現(xiàn)AOP,在不改變主業(yè)務(wù)邏輯的情況下增強(qiáng)應(yīng)用程序的功能,需要的朋友可以參考下
    2024-06-06
  • Java中MyBatis的動(dòng)態(tài)語(yǔ)句詳解

    Java中MyBatis的動(dòng)態(tài)語(yǔ)句詳解

    這篇文章主要介紹了Java中MyBatis的動(dòng)態(tài)語(yǔ)句詳解,動(dòng)態(tài) SQL 是 MyBatis 的強(qiáng)大特性之一,通過(guò)不同參數(shù)生成不同的 SQL,可以動(dòng)態(tài)地對(duì)數(shù)據(jù)持久層進(jìn)行操作,而不需要每個(gè)數(shù)據(jù)訪問(wèn)操作都要進(jìn)行手動(dòng)地拼接 SQL 語(yǔ)句,需要的朋友可以參考下
    2023-08-08
  • java多線程中的volatile和synchronized用法分析

    java多線程中的volatile和synchronized用法分析

    這篇文章主要介紹了java多線程中的volatile和synchronized用法分析,以實(shí)例的形式分析了在多線程中volatile和synchronized的用法區(qū)別與使用原理,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • Java類的繼承原理與用法分析

    Java類的繼承原理與用法分析

    這篇文章主要介紹了Java類的繼承原理與用法,結(jié)合實(shí)例形式分析了java類的繼承相關(guān)原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02

最新評(píng)論

灵宝市| 砀山县| 沙洋县| 姚安县| 建始县| 日照市| 冷水江市| 大余县| 林西县| 逊克县| 青铜峡市| 德格县| 南汇区| 额敏县| 遂昌县| 阜平县| 来凤县| 武威市| 兴国县| 江川县| 图片| 卫辉市| 土默特右旗| 邵阳市| 大竹县| 伊金霍洛旗| 明光市| 澄江县| 巴东县| 于都县| 涟水县| 南召县| 澳门| 买车| 开平市| 江阴市| 邢台市| 虎林市| 望江县| 兴海县| 棋牌|