91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java如何實現裝飾者模式

發布時間:2021-08-07 14:14:55 來源:億速云 閱讀:118 作者:小新 欄目:編程語言

這篇文章主要介紹java如何實現裝飾者模式,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

定義:

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

角色:

    抽象構件角色(Project):給出一個接口,以規范準備接收附加責任的對象。
    具體構件角色(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類,同時也沒有定義他的子類而實現了Person的擴展,這就是裝飾者模式的作用。

優點:

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

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

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

缺點:

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

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

裝飾者與適配者模式的區別:

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

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

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

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

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

裝飾者和繼承的區別:

繼承:

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

裝飾者:

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

使用場景:

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

以上是“java如何實現裝飾者模式”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

麟游县| 靖江市| 石林| 抚松县| 济宁市| 灵宝市| 苍溪县| 鄱阳县| 连南| 井研县| 乌拉特中旗| 凤阳县| 论坛| 凤冈县| 闻喜县| 武汉市| 永宁县| 汪清县| 石首市| 揭阳市| 临西县| 衡水市| 容城县| 太和县| 徐汇区| 西平县| 团风县| 许昌县| 七台河市| 项城市| 宿松县| 青田县| 临猗县| 财经| 防城港市| 云林县| 甘肃省| 布拖县| 定远县| 拉萨市| 嵊州市|