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

23種設計模式(6)java裝飾者模式

 更新時間:2021年09月15日 16:37:23   作者:阿木俠  
這篇文章主要為大家詳細介紹了23種設計模式之java裝飾者模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下

23種設計模式第六篇:java裝飾者模式

定義:

在不必改變原類文件和原類使用的繼承的情況下,動態(tài)地擴展一個對象的功能。
它是通過創(chuàng)建一個包裝對象,也就是用裝飾來包裹真實的對象來實現(xiàn)。

角色:

抽象構件角色(Project):給出一個接口,以規(guī)范準備接收附加責任的對象。
具體構件角色(Employe):定義一個將要接收附加責任的類。
裝飾角色(Manager):持有一個構件對象的實例,并定義一個與抽象構件接口一致的接口。
具體裝飾角色(ManagerA、ManagerB):負責給構件對象“貼上”附加的責任。

示例:

公共接口:

public interface Person { 
  void eat(); 
}

被裝飾對象:

public class OldPerson implements Person { 
  @Override 
  public void eat() { 
    System.out.println("吃飯"); 
  } 
} 

裝飾對象:

public class NewPerson implements Person { 
  private OldPerson p; 

  NewPerson(OldPerson p) { 
    this.p = p; 
  } 

  @Override 
  public void eat() { 
    System.out.println("生火"); 
    System.out.println("做飯"); 
    p.eat(); 
    System.out.println("刷碗");  
  } 
} 

測試:

public class PersonDemo { 
  public static void main(String[] args) { 
    OldPerson old = new OldPerson(); 
    //old.eat(); 
    NewPerson np = new NewPerson(old); 
    np.eat(); 
  } 
} 

通過例子可以看到,沒有改變原來的OldPerson類,同時也沒有定義他的子類而實現(xiàn)了Person的擴展,這就是裝飾者模式的作用。

優(yōu)點:

1、使用裝飾者模式比使用繼承更加靈活,因為它選擇通過一種動態(tài)的方式來擴展一個對象的功能,在運行時可以選擇不同的裝飾器,從而實現(xiàn)不同的行為。

2、通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出很多不同行為的組合。可以使用多個具體裝飾類來裝飾同一對象,得到功能更為強大的對象。

3、具體構件類與具體裝飾類可以獨立變化,他能是低耦合的。用戶可以根據(jù)需要來增加新的具體構件類和具體裝飾類,在使用時再對其進行各種組合,原有代碼無須改變,符合“開閉原則”。

缺點:

1、會產生很多的小對象,增加了系統(tǒng)的復雜性

2、這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加易于出錯,排錯也很困難,對于多次裝飾的對象,調試時尋找錯誤可能需要逐級排查,較為煩瑣。

裝飾者與適配者模式的區(qū)別:

1、適配器模式主要用來兼容那些不能在一起工作的類,使他們轉化為可以兼容目標接口,雖然也可以實現(xiàn)和裝飾者一樣的增加新職責,但目的不在此。

裝飾者模式主要是給被裝飾者增加新職責的。

2、適配器模式是用新接口來調用原接口,原接口對新系統(tǒng)是不可見或者說不可用的。
裝飾者模式原封不動的使用原接口,系統(tǒng)對裝飾的對象也通過原接口來完成使用。

3、適配器是知道被適配者的詳細情況的(就是那個類或那個接口)。

裝飾者只知道其接口是什么,至于其具體類型(是基類還是其他派生類)只有在運行期間才知道。

裝飾者和繼承的區(qū)別:

繼承:

優(yōu)點:代碼結構清晰,而且實現(xiàn)簡單
缺點:對于每一個的需要增強的類都要創(chuàng)建具體的子類來幫助其增強,這樣會導致繼承體系過于龐大。

裝飾者:

優(yōu)點:內部可以通過多態(tài)技術對多個需要增強的類進行增強
缺點:需要內部通過多態(tài)技術維護需要增強的類的實例。進而使得代碼稍微復雜。

使用場景:

1、需要擴展一個類的功能,或給一個類添加附加職責。
2、需要動態(tài)的給一個對象添加功能,這些功能可能不明確或者暫時的,可以隨時很方便的動態(tài)撤銷掉。
3、需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關系變的不現(xiàn)實。
4.、當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產生大量的子類,使得子類數(shù)目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。

轉自:java知音

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • IDEA插件之彩虹括號Rainbow?Brackets使用介紹

    IDEA插件之彩虹括號Rainbow?Brackets使用介紹

    這篇文章主要為大家介紹了IDEA插件之彩虹括號Rainbow?Brackets使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • struts2中使用注解配置Action方法詳解

    struts2中使用注解配置Action方法詳解

    這篇文章主要介紹了struts2中使用注解配置Action方法詳解,涉及一個示例,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Java面試題沖刺第三天--集合框架篇

    Java面試題沖刺第三天--集合框架篇

    這篇文章主要為大家分享了最有價值的三道java面試題,涵蓋內容全面,包括數(shù)據(jù)結構和算法相關的題目、經典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • webuploader 實現(xiàn)圖片批量上傳功能附實例代碼

    webuploader 實現(xiàn)圖片批量上傳功能附實例代碼

    這篇文章主要介紹了webuploader 實現(xiàn)圖片批量上傳功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • IntelliJ IDEA 刷題利器 LeetCode 插件詳解

    IntelliJ IDEA 刷題利器 LeetCode 插件詳解

    這篇文章主要介紹了IntelliJ IDEA 刷題利器 LeetCode 插件,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • JAVA中的字段校驗(validation)

    JAVA中的字段校驗(validation)

    這篇文章主要介紹了JAVA中的字段校驗(validation)用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Spring data jpa @Query update的坑及解決

    Spring data jpa @Query update的坑及解決

    這篇文章主要介紹了Spring data jpa @Query update的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java學習筆記之觀察者模式

    Java學習筆記之觀察者模式

    這篇文章主要為大家詳細介紹了Java學習筆記之觀察者模式的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 手把手教你實現(xiàn)idea中配置國內源

    手把手教你實現(xiàn)idea中配置國內源

    idea的國內源配置十分重要,能夠提升程序開發(fā)的效率而且也是減少bug的一種有效防范,本文就來介紹一下idea中配置國內源,具有一定的參考價值,感興趣的可以了解一下
    2023-07-07
  • Java定時器問題實例解析

    Java定時器問題實例解析

    這篇文章主要結合實例介紹了java當中的定時器的一些問題,有需要的朋友可以參考一下
    2017-04-04

最新評論