裝飾器模式主要特徵是用特殊的方式給對象添加功能職責,實際上,這個裝飾器跟我們想象的裝飾一棵聖誕樹差不多,但又有不同之處。
我的理解是,雖然增加了裝飾物,但是這些裝飾物不是直接add上去的,之前一直被這個概念搞混。因為這種模式是建立在一個超類的基礎上的,例如的:Component,所有其他的類都是這個超類的子類,包括具體的組件和裝飾類。因此我們裝飾的對象,與被裝飾的對象,是繼承共同的超類的。這也是被裝飾的對象可以在保持核心結構不變的情況下改變屬性的原因。
也就是說,無論裝飾器類增加了什麼功能,只要重寫了超類的方法,就可以順利回溯被裝飾類的方法。
也就是說,裝飾器相當於把一個物品放在禮品盒裡面,禮品盒就是裝飾類,而整個禮物,還可以實現原來沒有封裝時候的物品的功能。
用Actionscript3.0的代碼實現:
【組件類】即超類
package {/** * 裝飾模型中的抽象組件 * 抽象類別 * @author 橡樹小屋 */public class Component{public var info:String;public function getInfo():String {return info;}}}
【具體組件類】
package {/** * ... * @author 橡樹小屋 */public class ConcreteComponent extends Component{public function ConcreteComponent() {info = "具體組件-";}}}
【抽象裝飾類】
package {public class Decorator extends Component{override public function getInfo():String {return info;}}}
【具體裝飾類】
package {public class DecConA extends Decorator{private var components:Component;public function DecConA(con:Component) {components = con;}override public function getInfo():String {return components.getInfo() + "裝飾A";}}}
package {public class DecConB extends Decorator{private var components:Component;public function DecConB(con:Component) {components = con;}override public function getInfo():String {return components.getInfo() + "裝飾B";}}}
【用戶端】
package {public class main extends MovieClip{public function main() {var obj:Component = new ConcreteComponent();obj = new DecConA(obj);obj = new DecConB(obj);trace(obj.getInfo());}}}
參考資料:《Actionscript 3.0 設計模式》