国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 23種設計模式(6) java裝飾者模式

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

2021-02-02 11:33阿木俠 Java教程

這篇文章主要為大家詳細介紹了23種設計模式之java裝飾者模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

定義:

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

角色:

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

示例:

公共接口:

?
1
2
3
public interface Person {
  void eat();
}

被裝飾對象:

?
1
2
3
4
5
6
public class OldPerson implements Person {
  @Override
  public void eat() {
    System.out.println("吃飯");
  }
}

裝飾對象:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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("刷碗"); 
  }
}

測試:

?
1
2
3
4
5
6
7
8
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知音

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 中文字幕日韩一区二区不卡 | 自拍偷拍 亚洲 欧美 | 久久亚洲精品综合 | 欧美在线高清 | 亚洲国产成人精品久久 | 色在线免费观看 | 精品国产在 | 日韩理论在线 | 精品伊人 | 亚洲一区成人在线观看 | 黄色免费在线观看 | 日韩欧美综合 | av免费观看网页 | 亚洲一区二区中文字幕 | 中文字幕亚洲国产 | 一级一片免费 | 久久亚洲国产精品 | 国产精品久久久久无码av | av免费在线观看网站 | 国产精品久久久久一区二区三区 | 日韩精品久久久 | 欧美 日韩 精品 | 在线欧美亚洲 | 综合av在线| 国产亚洲一区二区三区 | 黑森林av凹凸导航 | 久久逼逼| 国产欧美日韩综合精品一区二区 | 欧美黑人一级爽快片淫片高清 | 国产一区二区三区四区在线观看 | 成人av免费看 | 精品无码久久久久久国产 | 青青草免费在线视频 | 国产成人av网站 | 一级片导航 | 成人午夜视频在线观看 | 日韩一区中文字幕 | 激情欧美日韩一区二区 | 国产精品不卡 | 免费人成黄页网站在线一区二区 | 久久久精品|