在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

如何動態地給一個類增加功能

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 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):動態的給一個對象添加額外的職責,就增加功能來說, 裝飾模式相比生成子類更為靈活。

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

2、裝飾器模式定義

圖片

①、Component抽象構件

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

②、ConcreteComponent 具體構件

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

③、Decorator裝飾角色

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

④、ConcreteDecorator 具體裝飾角色

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

3、裝飾器模式通用代碼實現

/**
 * 抽象構件
 */
public abstract class Component {
    public abstract void operator();
}
/**
 * 具體構件
 */
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;
    }

    // 委托給被修飾者執行
    @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();
    }
}

打印結果:

圖片

4、裝飾器模式優點

①、裝飾模式可以動態地擴展一個實現類的功能。

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

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

5、裝飾器模式應用場景

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

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

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

    關注

    33

    文章

    8650

    瀏覽量

    151409
  • 代碼
    +關注

    關注

    30

    文章

    4803

    瀏覽量

    68752
收藏 人收藏

    評論

    相關推薦

    在單片機上實現動態加載功能

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

    在Delphi中動態地使用SQL查詢語句

    在Delphi中動態地使用SQL查詢語句在般的數據庫管理系統中,通常都需要應用SQL查詢語句來提高程序的動態特性。下面介紹如何在Delphi中實現這種功能。在Delphi中,使用SQ
    發表于 05-10 11:10

    labview中怎么動態地讀取波形文件

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

    DLP?動態地面投影技術介紹

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

    我能否動態地更改IRQ的優先級呢

    程序時,如果異常的優先級高于正在處理的異常的優先級,則異??梢該屨籍惓L幚沓绦颉本臀叶?,我能否動態地更改 IRQ 的優先級,以便將新事件作為嵌套在同 IRQ 中的新 IRQ 進行處理?
    發表于 12-22 07:38

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

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

    AutoCAD增加計算器功能

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

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

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

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

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

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

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

    用于汽車外部照明的DLP?動態地面投影技術

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

    什么是地鐵LCD動態地圖?-條形智能

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

    在單片機上實現動態加載功能的函數庫介紹

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

    動態地面投影應用要求

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

    DLP3021-Q1動態地面投影系統設計

    電子發燒友網站提供《DLP3021-Q1動態地面投影系統設計.pdf》資料免費下載
    發表于 09-21 09:36 ?0次下載
    DLP3021-Q1<b class='flag-5'>動態地</b>面投影系統設計
    主站蜘蛛池模板: 国产色婷婷精品综合在线手机播放 | 你懂的福利网站| 李老汉的性生生活1全部| 成人在线一区二区三区| 亚洲国产影视| 国产私拍视频| freesexvideo性欧美2| 男人和女人做a免费视频| 久久婷婷国产一区二区三区| 日本高清视频色wwwwww色| 无遮挡高清一级毛片免费 | 色婷婷久| 一级待一黄aaa大片在线还看| tube69hdxxxx日本| 99香蕉精品视频在线观看| 理论片午夜| 天堂资源在线官网资源| 一级片在线免费| 成人综合色站| 国产主播精品在线| 国产一区二区影院| www.色天使| 欧美久久天天综合香蕉伊| 深夜视频在线观看免费| 特黄特色大片免费视频大全| 精品亚洲大全| 成人深夜视频| 性做久久久久| 激情九月| 一级片视频播放| 日韩午夜r电影在线观看| 日本三级午夜| 毛片大全在线| 久操色| 国产香港日本三级在线观看| 一级片在线观看视频| 国产精品夜夜春夜夜爽久久| 视色4se视频在线观看| 最近国语视频免费观看在线播放| www在线视频| 国产精品第9页|