優點:① 可以提供比繼承更多的靈活性,原有**無須變動,只是在原物件上裝飾一層「外衣」。
② 可以動態擴充套件乙個物件的功能,在執行時選擇不同的裝飾器,從而實現不同的行為。
缺點:① 會產生很多的小物件,增加了系統的複雜性
② 比繼承更加靈活,同時意味著比繼承更易出錯,排錯也困難,對於多次裝飾的物件,可能需要逐級排查。
適用範圍:
在不影響其他物件的情況下,動態、透明的為特定物件新增新功能,同時也可動態撤銷新功能。
當不能採用繼承的方式對系統進行擴充或者採用繼承不利於系統擴充套件和維護時。
客戶端:
concretecomponent c = new concretecomponent(); //待裝飾物件
decorator a = new concretedecoratora(); //裝飾1
decorator b = new concretedecoratorb(); //裝飾2
a.setcomponent(c); //裝飾1加入物件c
b.setcomponent(a); //裝飾2加入物件c(已含裝飾1)
b.operation(); //全部展示
一句話概括:在不影響其他物件的情況下,為原有物件新增「新的衣服」。
/*** component (待裝飾物件介面,含執行方法)
* concretecomponent (待裝飾物件例項化)
** decorator (裝飾抽象類,繼承了component介面,且有component屬性)
* concretedecoratora concretedecoratorb (兩個裝飾例項,為component的執行方法新增新內容)
*/
C 設計模式(九)裝飾者模式
首先實現乙個學生學習的功能,例項化乙個學生物件,然後呼叫學生的學習方法,現在有新的需求,學生學習前需要預習課程,學習後需要複習課程,老師答疑。要求 在不改動原有封裝的前提下實現以上功能。在這種情況下,就得使用aop 面向切面程式設計 程式設計思想,我們就用 繼承 組合 裝飾者模式來實現aop 實現要...
學習C 設計模式(九)裝飾者模式
using system namespace decorator public class fruit 水果抽象裝飾者 public abstract class fruitdecorator fruit 種植水果 public override void plant 為fruitdecorator...
設計模式 裝飾者模式
public abstract class beverage public abstract double cost public abstract class condimentdecorator extends beverage public class darkroast extends be...