色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    瀏覽量

    151439
  • 代碼
    +關注

    關注

    30

    文章

    4803

    瀏覽量

    68766
收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

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

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

    程序時,如果異常的優先級高于正在處理的異常的優先級,則異常可以搶占異常處理程序”就我而言,我能否動態地更改 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 ?889次閱讀
    <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 ?2307次閱讀

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

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

    動態地面投影應用要求

    電子發燒友網站提供《動態地面投影應用要求.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>面投影系統設計
    主站蜘蛛池模板: 毛片大全网站| 国产成人精品永久免费视频| beeg日本高清xxxx| 精品爽爽久久久久久蜜臀| 少妇两个奶头喷出奶水了怎么办 | 羞羞麻豆国产精品1区2区3区| 俄罗斯兽交XXXXX在线| 人妻互换免费中文字幕| abp-146| 欧美深深色噜噜狠狠yyy| 99热热在线精品久久| 视频成人永久免费视频| 国产高清亚洲日韩字幕一区| 无码人妻视频又大又粗欧美| 东北女人奶大毛多水多| 日韩AV爽爽爽久久久久久| 俄罗斯破处| 一本道综合久久免费| 久久精品国产在热亚洲完整版| 亚洲视频成人| 伦理片在线线手机版韩国免费观看 | 善良的女房东味道2在线观看| 久久久无码AV精品亚洲A片软件| 岳打开双腿开始配合日韩视频| 撅高 自己扒开 调教| 91原创在线| 人妻免费视频公开上传| 國産麻豆AVMDMD0179| 真人美女精美小穴| 免费国产久久啪在线| 拔萝卜在线高清观看视频| 色悠久久综合| 老师你奶真大下面水真多| 国产免费人视频在线观看免费 | 轻轻挺进女教师的身体| 儿子日母亲B好爽| 在线免费视频国产| 亚洲 欧美 国产 综合五月天| 琪琪伦伦影院理论片| 久久综合狠狠综合狠狠| 国产亚洲精品视频在线网|