代碼執行結果如下圖:
代碼說明
l Weapon是抽象構件角色。
l Rifle是具體構件角色,實現抽象構件的接口。
l Decorator是裝飾角色。裝飾角色有兩個特點,一是繼承了抽象構件的接口,二是有一個構件角色的實例。
l Enhance和Wear是具體裝飾角色,它們負責給構件附加責任。
l 客戶端在使用裝飾角色的時候並沒有針對抽象構件進行編程,因為我們確實需要使用具體裝飾角色提供的額外方法,這種類型的裝飾叫做半透明裝飾。
何時采用
l 從代碼角度來說,如果你覺得由於功能的交叉擴展不會導致非常多的子類或者非常多的繼承層次的話可以考慮裝飾模式。
l 從應用角度來說,如果你希望動態給類賦予或撤銷一些職責,並且可以任意排列組合這些職責的話可以使用裝飾模式。