<裝飾模式是繼承的一個替代模式>
概念理解
-
定義:在不改變原有類的結構基礎上,動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更為靈活。
Decorator.png
Component:原始組件的抽象類或者接口
ConcreteComponent:原始的組件對象,通常是被裝飾器裝飾的原始對象;
Decorator:裝飾器的抽象類或者接口。為了實現裝飾器功能的復用,需要繼承組件接口類Component;并持有一個Component對象。(如果不繼承組件接口類Component,則只能為某個組件添加單一的功能,即裝飾器對象不能在裝飾其他的裝飾器對象。)
ConcreteDecorator:具體的裝飾器類,實現向被裝飾對象添加的不同的功能。
應用和優缺點
解決問題:
避免子類膨脹:擴展一個類經常使用繼承方式實現,由于繼承為類引入靜態特征,并且隨著擴展功能的增多,子類會很膨脹。應用實例:
1、裝飾模式為已有類動態附加額外的功能就像LOL、王者榮耀等類Dota游戲中,英雄升級一樣。每次英雄升級都會附加一個額外技能點學習技能。具體的英雄就是ConcreteComponent,技能欄就是裝飾器Decorator,每個技能就是ConcreteDecorator;應用場景:
1、擴展一個類的功能。
2、動態增加功能,動態撤銷。優點:
1、裝飾者模式可以提供比繼承更多的靈活性
2、裝飾類和被裝飾類可以獨立發展,不會相互耦合
3、替代繼承的強耦合關系,模塊解耦缺點:
1、會產生很多的小對象,增加了系統的復雜性
2、多層裝飾復雜度增加,意味著更加易于出錯,排錯也很困難,調試時尋找錯誤可能需要逐級排查,較為煩瑣。
參考:
裝飾器模式(Decorator)