裝飾模式:動態の給一個對象添加有些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。
Component是定義一個對象接口,可以給這些對象動態添加職責
ConcreteComponent是定義了一個具體的對象,也可以給這個對象添加一些職責
Decorator裝飾抽象類,繼承了Component,從外類來擴展Componnt類的功能,但對於Component來說,是無需知道Decorator的存在的
Component類
ConcreteComponnet類
Decorator類
.component = (component !=
ConcreteDecoratorA
=
ConcreteDecoratprB
客戶端調用實例
Main(= = =
裝飾的方式是:首先用ConcreteComponent實例化cc,然後用ConcreteComponentA的實例化對象ca來包裝cc,再用ConcreteComponetB的對象cb包裝ca,最終執行cb的Operation()
其實就是利用Setcomponent來對對象進行包裝的。這樣每個裝飾對象的實現就和如何使用這個對象分離開了,每個裝飾對象只關心自己的功能,不需要關心如何被添加到對象鏈當中。
不過也有特殊情況:如果只有一個ConcreteComponent類而沒有抽象的Component類,那麼Decorator類可以是ConcreteComponent的一個子類。同樣道理,如果只有一個ConcreteDecorator類,那麼就沒必要建立單獨的Decorator類,而可以把Decorator和ConcreteDecorator的責任合並成一個類。
裝飾模式就是為已有功能動態添加更多功能的一種方式。
優點可以這樣說:把類中的裝飾功能從類中搬移去除,這樣可以簡化原有的類。有效的把類的核心職責和裝飾功能區分開了。