23種設計模式(6)-裝飾者模式
定義:
在不必改變原類檔案和原類使用的繼承的情況下,動態地擴充套件一個物件的功能。
它是通過建立一個包裝物件,也就是用裝飾來包裹真實的物件來實現。
角色:
抽象構件角色(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. 當不能採用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴充套件,為支援每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用於生成子類。
閒暇之餘鞏固一下自己的知識體系 ,擴充一下自己的知識面。快利用瑣碎時間給自己充電吧 !
相關文章
- 23種設計模式:03裝飾模式設計模式
- 實踐GoF的23種設計模式:裝飾者模式Go設計模式
- 23種設計模式(三)--裝飾器模式設計模式
- 設計模式-裝飾者模式設計模式
- 設計模式——裝飾者模式設計模式
- [設計模式]裝飾者模式設計模式
- 小白設計模式:裝飾者模式設計模式
- 設計模式之裝飾者模式設計模式
- 設計模式系列10–裝飾者模式設計模式
- 設計模式之裝飾者模式(二)設計模式
- 設計模式之裝飾者模式(一)設計模式
- PHP設計模式之裝飾者模式PHP設計模式
- Java設計模式(3)-裝飾者模式Java設計模式
- Java設計模式之裝飾者模式Java設計模式
- 設計模式第三講-裝飾者模式設計模式
- 設計模式系列10--裝飾者模式設計模式
- 23種設計模式之--建造者模式設計模式
- 23種設計模式之建造者模式設計模式
- 23種設計模式之中介者模式設計模式
- 23種設計模式之觀察者模式設計模式
- 設計模式——裝飾模式設計模式
- 設計模式-裝飾模式設計模式
- 6、Python與設計模式–裝飾器模式Python設計模式
- 設計模式-裝飾設計模式設計模式
- Head First 設計模式(3)----裝飾者模式設計模式
- 設計模式 | 裝飾者模式及典型應用設計模式
- 8.java設計模式之裝飾者模式Java設計模式
- Java設計模式之裝飾者模式(Decorator pattern)Java設計模式
- 設計模式(十一)----結構型模式之裝飾者模式設計模式
- 23種設計模式之訪問者模式設計模式
- 修飾者模式(裝飾者模式,Decoration)模式
- 設計模式----裝飾器模式設計模式
- 設計模式-裝飾器模式設計模式
- [設計模式] 裝飾器模式設計模式
- 設計模式(八):裝飾模式設計模式
- 【設計模式之裝飾模式】設計模式
- 設計模式之裝飾模式設計模式
- 設計模式(八)Context中的裝飾者模式設計模式Context