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

java設(shè)計模式系列之裝飾者模式

 更新時間:2016年02月13日 21:52:31   作者:VictorZhang  
這篇文章主要為大家詳細(xì)介紹了java設(shè)計模式之裝飾者模式,裝飾者模式是一種結(jié)構(gòu)式模式,感興趣的朋友可以參考一下

何為裝飾者模式 (Decorator)?
動態(tài)地給一個對象添加一些額外的職責(zé)。就增加功能來說,Decorator 模式相比生成子類更為靈活。
一、結(jié)構(gòu)

Component : 定義一個對象接口,可以給這些對象動態(tài)地添加職責(zé)。

interface Component {
  public void operation();
}
ConcreteComponent : 實現(xiàn) Component 定義的接口。
class ConcreteComponent implements Component {
  @Override
  public void operation() {
    System.out.println("初始行為");
  }
}

Decorator : 裝飾抽象類,繼承了 Component, 從外類來擴(kuò)展 Component 類的功能,但對于 Component 來說,是無需知道 Decorator 的存在的。

class Decorator implements Component {
  // 持有一個 Component 對象,和 Component 形成聚合關(guān)系
  protected Component component;
  
  // 傳入要進(jìn)一步修飾的對象
  public Decorator(Component component) {
    this.component = component;
  }
  
  @Override
  // 調(diào)用要修飾對象的原方法
  public void operation() {
    component.operation();
  }
}

ConcreteDecorator : 具體的裝飾對象,起到給 Component 添加職責(zé)的功能。

class ConcreteDecoratorA extends Decorator {
  private String addedState = "新屬性1";
  
  public ConcreteDecoratorA(Component component) {
    super(component);
  }
  
  public void operation() {
    super.operation();
    System.out.println("添加屬性: " + addedState);
  }
}

class ConcreteDecoratorB extends Decorator {
  public ConcreteDecoratorB(Component component) {
    super(component);
  }

  public void operation() {
    super.operation();
    AddedBehavior();
  }
  
  public void AddedBehavior() {
    System.out.println("添加行為");
  }
}

測試代碼

public class DecoratorPattern {
  public static void main(String[] args) {
    Component component = new ConcreteComponent();
    component.operation();
    
    System.out.println("======================================");
    Decorator decoratorA = new ConcreteDecoratorA(component);
    decoratorA.operation();
    
    System.out.println("======================================");
    Decorator decoratorB = new ConcreteDecoratorB(decoratorA);
    decoratorB.operation();
  }
}

運行結(jié)果

初始行為
======================================
初始行為
添加屬性: 新屬性1
======================================
初始行為
添加屬性: 新屬性1
添加行為

 二、應(yīng)用場景

1、需要動態(tài)的、透明的為一個對象添加職責(zé),即不影響其他對象。
2、需要動態(tài)的給一個對象添加功能,這些功能可以再動態(tài)的撤銷。
3、需要增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能,從而使繼承關(guān)系變的不現(xiàn)實。
4、當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時。一種情況是,可能有大量獨立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。

三、要點

1、裝飾對象和真實對象有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互。

2、裝飾對象包含一個真實對象的引用(reference)。

3、裝飾對象接受所有來自客戶端的請求。它把這些請求轉(zhuǎn)發(fā)給真實的對象。

4、裝飾對象可以在轉(zhuǎn)發(fā)這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結(jié)構(gòu)就可以在外部增加附加的功能。在面向?qū)ο蟮脑O(shè)計中,通常是通過繼承來實現(xiàn)對給定類的功能擴(kuò)展。

以上就是關(guān)于java裝飾者模式的相關(guān)內(nèi)容介紹,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • mybatisplus實現(xiàn)自動填充時間的項目實踐

    mybatisplus實現(xiàn)自動填充時間的項目實踐

    在數(shù)據(jù)庫操作中,頻繁設(shè)置創(chuàng)建時間和更新時間字段非常繁瑣,通過使用MyBatis-Plus的自動填充功能,可以簡化操作,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2024-10-10
  • Java拋出異常與自定義異常類應(yīng)用示例

    Java拋出異常與自定義異常類應(yīng)用示例

    這篇文章主要介紹了Java拋出異常與自定義異常類,結(jié)合實例形式分析了Java針對錯誤與異常處理的try、catch、throw等語句相關(guān)使用技巧,需要的朋友可以參考下
    2019-03-03
  • Java中PrintWriter使用方法介紹

    Java中PrintWriter使用方法介紹

    這篇文章主要介紹了Java中PrintWriter使用方法介紹,文章圍繞主題展開PrintWriter使用方法的詳細(xì)介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-06-06
  • SpringMVC中Invalid bound statement (not found)常見報錯問題解決

    SpringMVC中Invalid bound statement (not f

    本文主要介紹了SpringMVC中Invalid bound statement (not found)常見報錯問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Springboot通過url訪問本地圖片代碼實例

    Springboot通過url訪問本地圖片代碼實例

    這篇文章主要介紹了springboot通過url訪問本地圖片代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 一篇文章帶你了解如何正確使用java線程池

    一篇文章帶你了解如何正確使用java線程池

    這篇文章主要介紹了如何正確使用java線程池,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • Mybatis中3種關(guān)聯(lián)關(guān)系的實現(xiàn)方法示例

    Mybatis中3種關(guān)聯(lián)關(guān)系的實現(xiàn)方法示例

    這篇文章主要給大家介紹了關(guān)于Mybatis中3種關(guān)聯(lián)關(guān)系的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 一篇文章帶你了解SpringMVC數(shù)據(jù)綁定

    一篇文章帶你了解SpringMVC數(shù)據(jù)綁定

    這篇文章主要給大家介紹了關(guān)于如何通過一篇文章弄懂Spring MVC的參數(shù)綁定,文中通過示例代碼以及圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • SpringBoot整合WebSocket實現(xiàn)后端向前端主動推送消息方式

    SpringBoot整合WebSocket實現(xiàn)后端向前端主動推送消息方式

    這篇文章主要介紹了SpringBoot整合WebSocket實現(xiàn)后端向前端主動推送消息方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • java避免多層嵌套循環(huán)用到的一些小技巧分享

    java避免多層嵌套循環(huán)用到的一些小技巧分享

    這篇文章主要介紹了java避免多層嵌套循環(huán)用到的一些小技巧分享,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論

汝州市| 长垣县| 长泰县| 常宁市| 景谷| 枣强县| 密山市| 察雅县| 新乡市| 桃园市| 怀化市| 邳州市| 辽中县| 祁阳县| 晋州市| 武强县| 奇台县| 平邑县| 玛纳斯县| 张家口市| 定日县| 大同市| 金寨县| 茌平县| 康保县| 明水县| 南阳市| 奉新县| 石首市| 古浪县| 商南县| 渑池县| 上林县| 公主岭市| 珲春市| 绩溪县| 孙吴县| 锡林郭勒盟| 永和县| 高邑县| 蓝山县|