现在的位置: 首页 > 综合 > 正文

装饰器模式小结

2012年08月29日 ⁄ 综合 ⁄ 共 1334字 ⁄ 字号 评论关闭

装饰器模式主要特征是用特殊的方式给对象添加功能职责,实际上,这个装饰器跟我们想象的装饰一棵圣诞树差不多,但又有不同之处。

我的理解是,虽然增加了装饰物,但是这些装饰物不是直接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 设计模式》

抱歉!评论已关闭.