1 意圖:動態地給一個對象添加一些額外的職責。就增長功能來講,Decorator模式相比生成子類更靈活。app
2 別名:包裝器Wrapper指針
3 動機:將組件嵌入到另外一個對象中,由這個對象添加邊框。嵌入的對象叫作裝飾。裝飾的接口與所裝飾的組件接口一致,所以對客戶透明。對象
因爲透明,能夠遞歸嵌套多個裝飾,添加任意多的功能。繼承
4 適用性:遞歸
. 不影響其餘對象的狀況下,以動態、透明的方式給單個對象添加職責。接口
. 處理那些能夠撤銷的職責it
. 當不能採用生成子類的方式擴充時。大量獨立的擴展,爲支持每一種組合將產生大量的子類。擴展
一種狀況,有大量獨立的擴展,爲支持每一種組合將產生大量子類,子類數目爆炸性增加。請求
另外一種狀況,由於類定義被隱藏,類定義不能生成子類。co
5 參與者:
. Component 定義一個對象接口,能夠給這些對象動態添加職責
. ConcreteComponent:定義一個對象,給這個對象添加一些職責
. Decrator:爲之一個指向Component對象的指針,定義一個與Component接口一致的接口。
. ConcreteDecrator:向組件添加職責
6 協做:
Decorator將請求轉發給它的Component對象,並有可能在轉發請求先後執行一些附加的動做。
7 效果:
優勢:
1)比靜態繼承更靈活
2)避免在層次結構高層的類有太多的特徵
3)Decorator與Component不同
4)有許多小對象
8 實現:
1)接口的一致性
2)省略抽象的Decorator
3)保持Component類的簡單性
4)改變對象外殼與改變對象內核
9 相關模式:
. Adapter只改變接口,Decorator僅改變職責
. Composite模式:可將裝飾視爲只有一個退化的、僅有一個組件的組合。
. Strategy改變對象的內核, Decorator改變對象的外殼