精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何動態(tài)地給一個類增加功能

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-09 14:25 ? 次閱讀

1、什么是裝飾器模式?

Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.

裝飾器模式(Decorator Pattern):動態(tài)的給一個對象添加額外的職責,就增加功能來說, 裝飾模式相比生成子類更為靈活。

說人話:一般的,我們?yōu)榱藬U展一個類經(jīng)常使用繼承方式實現(xiàn),隨著擴展功能的增多,子類會很膨脹。這時候期望在不改變類對象及其類定義的情況下,為對象添加額外功能,這就是裝飾器模式。

2、裝飾器模式定義

圖片

①、Component抽象構(gòu)件

Component是一個接口或者是抽象類, 就是定義我們最核心的對象, 也就是最原始的對象。

②、ConcreteComponent 具體構(gòu)件

ConcreteComponent是最核心、 最原始、 最基本的接口或抽象類的實現(xiàn), 你要裝飾的就是它。

③、Decorator裝飾角色

一般是一個抽象類, 實現(xiàn)接口或者抽象方法, 它里面可不一定有抽象的方法, 在它的屬性里必然有一個private變量指向Component抽象構(gòu)件。

④、ConcreteDecorator 具體裝飾角色

ConcreteDecoratorA和ConcreteDecoratorB是兩個具體的裝飾類, 你要把你最核心的、 最原始的、 最基本的東西裝飾成其他東西

3、裝飾器模式通用代碼實現(xiàn)

/**
 * 抽象構(gòu)件
 */
public abstract class Component {
    public abstract void operator();
}
/**
 * 具體構(gòu)件
 */
public class ConcreteComponent extends Component{
    @Override
    public void operator() {
        System.out.println("doSomething");
    }
}
/**
 * 抽象裝飾者
 */
public abstract class Decorator extends Component{
    private Component component;

    public Decorator(Component component){
        this.component = component;
    }

    // 委托給被修飾者執(zhí)行
    @Override
    public void operator() {
        this.component.operator();
    }
}
public class ConcreteDecorator1 extends Decorator{
    // 定義被修飾者
    public ConcreteDecorator1(Component component){
        super(component);
    }

    // 定義自己的修飾方法
    public void method1(){
        System.out.println("修飾方法 method1");
    }
    @Override
    public void operator() {
        this.method1();
        super.operator();
    }
}
public class ConcreteDecorator2 extends Decorator{
    // 定義被修飾者
    public ConcreteDecorator2(Component component){
        super(component);
    }

    // 定義自己的修飾方法
    public void method2(){
        System.out.println("修飾方法 method2");
    }
    @Override
    public void operator() {
        super.operator();
        this.method2();
    }
}

客戶端測試:

public class DecoratorClient {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        // 第一次修飾
        component = new ConcreteDecorator1(component);
        // 第二次修飾
        component = new ConcreteDecorator2(component);
        // 修飾后運行
        component.operator();
    }
}

打印結(jié)果:

圖片

4、裝飾器模式優(yōu)點

①、裝飾模式可以動態(tài)地擴展一個實現(xiàn)類的功能。

②、裝飾類和被裝飾類可以獨立發(fā)展, 而不會相互耦合。換句話說, Component類無須知道Decorator類, Decorator類是從外部來擴展Component類的功能, 而Decorator也不用知道具體的構(gòu)件。

③、裝飾模式是繼承關(guān)系的一個替代方案。我們看裝飾類Decorator, 不管裝飾多少層, 返回的對象還是Component, 實現(xiàn)的還是is-a的關(guān)系

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

①、需要擴展一個類的功能, 或給一個類增加附加功能。

②、需要動態(tài)地給一個對象增加功能, 這些功能可以再動態(tài)地撤銷。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8497

    瀏覽量

    150835
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4748

    瀏覽量

    68354
收藏 人收藏

    評論

    相關(guān)推薦

    在單片機上實現(xiàn)動態(tài)加載功能

    本項目是在單片機(如:STM32)上實現(xiàn)動態(tài)加載功能的函數(shù)庫,與Windows中的dll,Linux中的so類似,可以將代碼動態(tài)地從其他
    發(fā)表于 05-30 11:04 ?1820次閱讀

    在Delphi中動態(tài)地使用SQL查詢語句

    在Delphi中動態(tài)地使用SQL查詢語句在般的數(shù)據(jù)庫管理系統(tǒng)中,通常都需要應(yīng)用SQL查詢語句來提高程序的動態(tài)特性。下面介紹如何在Delphi中實現(xiàn)這種功能。在Delphi中,使用SQ
    發(fā)表于 05-10 11:10

    labview中怎么動態(tài)地讀取波形文件

    我最近在做用聲卡當采集卡完成示波器地基本功能,并要求能回放波形,我現(xiàn)在想要解決地是怎樣把采集的聲音信號保存為波形信號后,怎樣讀取這個波形文件,是要求動態(tài)地讀取,比如我錄音分鐘,波形播放也是
    發(fā)表于 06-04 17:24

    DLP?動態(tài)地面投影技術(shù)介紹

    動態(tài)地面投影技術(shù)能夠在同模塊內(nèi)顯示任何圖案,該技術(shù)通過提供全新的創(chuàng)新型照明功能,重塑消費者對外部照明的認知。創(chuàng)新型照明功能包括汽車光“毯”,可照亮車外的周圍區(qū)域或從側(cè)視鏡投影車輛信息
    發(fā)表于 11-07 06:16

    我能否動態(tài)地更改IRQ的優(yōu)先級呢

    程序時,如果異常的優(yōu)先級高于正在處理的異常的優(yōu)先級,則異常可以搶占異常處理程序”就我而言,我能否動態(tài)地更改 IRQ 的優(yōu)先級,以便將新事件作為嵌套在同 IRQ 中的新 IRQ 進行處理?
    發(fā)表于 12-22 07:38

    石英鐘增加音樂報時功能電路圖

    石英鐘增加音樂報時功能電路圖
    發(fā)表于 05-18 11:26 ?13次下載
    <b class='flag-5'>給</b>石英鐘<b class='flag-5'>增加</b>音樂報時<b class='flag-5'>功能</b>電路圖

    AutoCAD增加計算器功能

    AutoCAD增加計算器功能 在用AutoCAD進行繪圖時,經(jīng)常需要進行些必要的計算工作。盡管Autodesk公司隨AutoCAD
    發(fā)表于 02-14 17:05 ?1131次閱讀

    電話振鈴增加可視判斷功能

    電話振鈴增加可視判斷功能
    發(fā)表于 03-04 20:43 ?872次閱讀
    <b class='flag-5'>給</b>電話振鈴<b class='flag-5'>增加</b>可視判斷<b class='flag-5'>功能</b>

    動態(tài)地址計算配合at訪問像素_OpenCV3編程入門-源碼例程

    OpenCV3編程入門-源碼例程全集-用動態(tài)地址計算配合at訪問像素,感興趣的小伙伴們可以瞧瞧。
    發(fā)表于 09-18 17:02 ?0次下載

    用于動態(tài)地面投影的評估模塊和軟件工具入門

    用于動態(tài)地面投影的評估模塊和軟件工具入門
    發(fā)表于 10-28 11:59 ?1次下載
    用于<b class='flag-5'>動態(tài)地</b>面投影的評估模塊和軟件工具入門

    用于汽車外部照明的DLP?動態(tài)地面投影技術(shù)

    用于汽車外部照明的DLP?動態(tài)地面投影技術(shù)
    發(fā)表于 10-31 08:23 ?2次下載
    用于汽車外部照明的DLP?<b class='flag-5'>動態(tài)地</b>面投影技術(shù)

    什么是地鐵LCD動態(tài)地圖?-條形智能

    等位置,以方便乘客使用。 地鐵LCD動態(tài)地圖之所以被稱為“動態(tài)”,是因為它不僅僅是簡單的地圖,而且還能夠?qū)崟r更新車輛的位置、到站時間等信息。同時,它還可以根據(jù)乘客的位置和目的地,提
    的頭像 發(fā)表于 08-03 17:11 ?2169次閱讀

    在單片機上實現(xiàn)動態(tài)加載功能的函數(shù)庫介紹

    本項目是在單片機(如:STM32)上實現(xiàn)動態(tài)加載功能的函數(shù)庫,與Windows中的dll,Linux中的so類似,可以將代碼動態(tài)地從其他
    的頭像 發(fā)表于 11-09 10:55 ?1476次閱讀

    動態(tài)地面投影應(yīng)用要求

    電子發(fā)燒友網(wǎng)站提供《動態(tài)地面投影應(yīng)用要求.pdf》資料免費下載
    發(fā)表于 09-05 11:32 ?0次下載
    <b class='flag-5'>動態(tài)地</b>面投影應(yīng)用要求

    DLP3021-Q1動態(tài)地面投影系統(tǒng)設(shè)計

    電子發(fā)燒友網(wǎng)站提供《DLP3021-Q1動態(tài)地面投影系統(tǒng)設(shè)計.pdf》資料免費下載
    發(fā)表于 09-21 09:36 ?0次下載
    DLP3021-Q1<b class='flag-5'>動態(tài)地</b>面投影系統(tǒng)設(shè)計