欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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, 從外類來擴展 Component 類的功能,但對于 Component 來說,是無需知道 Decorator 的存在的。

class Decorator implements Component {
  // 持有一個 Component 對象,和 Component 形成聚合關(guān)系
  protected Component component;
  
  // 傳入要進一步修飾的對象
  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)不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。

三、要點

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

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

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

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

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

相關(guān)文章

  • 分析Spring框架之設(shè)計與實現(xiàn)資源加載器

    分析Spring框架之設(shè)計與實現(xiàn)資源加載器

    Spring框架是由于軟件開發(fā)的復(fù)雜性而創(chuàng)建的。然而,Spring的用途不僅僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合性角度而言,絕大部分Java應(yīng)用都可以從Spring中受益。今天來分析它的設(shè)計與實現(xiàn)資源加載器,從Spring.xml解析和注冊Bean對象
    2021-06-06
  • Java基礎(chǔ)之finally語句與return語句詳解

    Java基礎(chǔ)之finally語句與return語句詳解

    這篇文章主要介紹了Java基礎(chǔ)之finally語句與return語句詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Spring Boot 集成Dubbo框架實例

    Spring Boot 集成Dubbo框架實例

    本篇文章主要介紹了Spring Boot 集成Dubbo框架實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java實現(xiàn)int、long、Integer、Long之間的相互轉(zhuǎn)換

    Java實現(xiàn)int、long、Integer、Long之間的相互轉(zhuǎn)換

    本文主要介紹了Java實現(xiàn)int、long、Integer、Long之間的相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Java設(shè)計模式之策略模式詳解和示例

    Java設(shè)計模式之策略模式詳解和示例

    這篇文章主要介紹了Java設(shè)計模式之策略模式詳解和示例,策略模式就是一種行為可能會因為不同的邏輯造成多個算法,比如人吃飯,美國人吃飯用刀叉,中國吃飯用筷子,都是吃飯的行為但是使用的工具(算法)不一樣,需要的朋友可以參考下
    2024-01-01
  • java實現(xiàn)在性能測試中進行業(yè)務(wù)驗證實例

    java實現(xiàn)在性能測試中進行業(yè)務(wù)驗證實例

    這篇文章主要為大家介紹了java實現(xiàn)在性能測試中進行業(yè)務(wù)驗證實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • SpringAOP核心對象的創(chuàng)建圖解

    SpringAOP核心對象的創(chuàng)建圖解

    這篇文章主要介紹了SpringAOP核心對象的創(chuàng)建詳解,通過使用AOP,我們可以將橫切關(guān)注點(如日志記錄、性能監(jiān)控、事務(wù)管理等)從業(yè)務(wù)邏輯中分離出來,使得代碼更加模塊化、可維護性更高,需要的朋友可以參考下
    2023-10-10
  • Eureka源碼解析服務(wù)離線狀態(tài)變更

    Eureka源碼解析服務(wù)離線狀態(tài)變更

    這篇文章主要為大家介紹了Eureka源碼解析服務(wù)離線的狀態(tài)變更示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Java通過綁定實現(xiàn)快速將數(shù)據(jù)導(dǎo)出至Excel

    Java通過綁定實現(xiàn)快速將數(shù)據(jù)導(dǎo)出至Excel

    把數(shù)據(jù)導(dǎo)出至?Excel?是很常見的需求,而數(shù)據(jù)的持久化,往往又放在數(shù)據(jù)庫中,因此把數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出到?Excel中,成了非常普遍的一個需求,下面我們就來看看Java如何通過綁定實現(xiàn)快速將數(shù)據(jù)導(dǎo)出至Excel吧
    2023-10-10
  • Java 日志打印的15個好建議

    Java 日志打印的15個好建議

    這篇文章主要介紹了Java日志打印的15個好建議,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09

最新評論