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