定義:動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。
類型:結構型模式。
類圖:

參入者:
1. Component,抽象類,只是提供接口。
1. Model,一個具體對象,實現接口完成一些基本的功能。
1. Decorator,有一個指向Component的指針,并且實現了Componet的接口。
1. Hairtician,Costumer,都是具體的裝飾者,首先在實現基本的接口下,添加了新的功能。
適用性:
1. 裝飾模式其應用體現在裝飾上。那些需要動態添加同類型功能的產品,都可以使用裝飾模式。
1. 以添加新類的方式來給單個對象添加新裝飾。
1. 當不能以子類的方式擴展時,可以使用裝飾模式來擴展。
概述:
?????????裝飾者模式是一種結構模式,表明裝飾者模式主要是通過更改類的結構關系來實現的。Decorator與Model保持相同的接口,主要是為了保證操作Hairtician和Costumer時保持和操作Model時一樣的體驗。理論上來說,Decorator和Model不保持一樣的接口,重新定義接口也是可以的。這里的裝飾是一種鏈式的,即每一種新添加的裝飾都是在之前的基本上生成新的類來完成的。新類在完成新添加的裝飾之后,然后將接下來的動作返還到上一個裝飾者。依次這樣,達到鏈式完成裝飾的功能。因為保持接口一致,在客戶看來,其實是一致的,不影響客戶的調用及體驗。
示例代碼:
~~~
// C#
namespace?Design10
{
???class?Component
???{
???????public?virtual?void?MakeUp()?{?}
???}
???class?Model?:?Component
???{
???????public?override?void?MakeUp()
???????{
???????????Console.WriteLine("模特自己完成基本的裝扮");
???????}
???}
???abstract?class?Decorator?:?Component
???{
???????protected?Component?component;
???????public?void?SetComponent(Component?component)
???????{
???????????this.component?=?component;
???????}
???????public?override?void?MakeUp()
???????{
???????????if?(component?!=?null)
???????????{
???????????????component.MakeUp();
???????????}
???????}
???}
???class?Hairtician?:?Decorator
???{
???????public?override?void?MakeUp()
???????{
???????????base.MakeUp();
???????????Console.WriteLine("做新的發型");
???????}
???}
???class?Costumer?:?Decorator
???{
???????public?override?void?MakeUp()
???????{
???????????base.MakeUp();
???????????AddedBehavior();
???????}
???????private?void?AddedBehavior()
???????{
???????????Console.WriteLine("穿個性化的裙子");
???????}
???}
???class?Program
???{
???????static?void?Main(string[]?args)
???????{
???????????Model?model?=?new?Model();
???????????Decorator?decorator1?=?new?Hairtician();
???????????Decorator?decorator2?=?new?Costumer();
???????????decorator1.SetComponent(model);
???????????decorator2.SetComponent(decorator1);
???????????decorator2.MakeUp();
???????}
???}
}
~~~
與其他模式比較:裝飾者模式其實與組合模式有一些類似的地方。都是通過組合的方法來實現添加新的模塊。只是裝飾者模式將產品獨立出來,抽象出來裝飾這個動作。而組合模式沒有將產品與動作分開,組合模式的鏈條可以是像裝飾者模式模式那樣單一鏈條,也可是樹形的,分出多個分支。
注意:
1. 如果是C++代碼需要注意抽象類的析構函數必須是虛函數,否則釋放內存的時候會出現問題。
1. C#,Java的時候,最開始的接口類不能改為接口,這樣多態在經過多次繼承之后會出現問題。
優缺點:
1. 優點,動態添加新功能,能夠組合不同的功能,并且保證接口的一致。
1. 缺點,如果添加的功能過多,會增加過多的類,增加程序復雜度。
參考資料:
1. 《設計模式——可復用面向對象軟件基礎》
1. 《Java與模式》
1. 《大話設計模式》
1. 《Head?First設計模式》
- 前言
- 設計模式六大原則
- 1——創建型模式之簡單工廠模式
- 2——創建型模式之工廠方法模式
- 3——創建型模式之抽象工廠模式
- 4——創建型模式之單例模式
- 5——創建型模式之建造者模式
- 6——創建型模式之原型模式
- 7——結構型模式之適配器模式
- 8——結構型模式之橋接模式
- 9——結構型模式之組合模式
- 10——結構型模式之裝飾者模式
- 11——結構型模式之外觀模式
- 12——結構型模式之享元模式
- 13——結構型模式之代理模式
- 14——行為型模式之職責鏈模式
- 15——行為型模式之命令模式
- 16——行為型模式之解釋器模式
- 17——行為型模式之迭代器模式
- 18——行為型模式之中介者模式
- 19——行為型模式之備忘錄模式
- 20——行為型模式之觀察者模式
- 21——行為型模式之狀態模式
- 22——行為型模式之策略模式
- 23——行為型模式之模板方法模型
- 24——行為型模式之訪問者模式
- 設計模式總結