码迷,mamicode.com
首页 > 其他好文 > 详细

装饰器模式的设计原理

时间:2015-01-04 11:29:13      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

         什么是装饰器模式?动态地给一个对象添加一些额外的工作职责,就增加功能来说,装饰器模式比继承的子类更灵活。

 技术分享

      从以上图我们可以看到:最核心的类就是Decorator类;它在中间扮演中关键的作用。在继承需要包装类的基础上,其也私有了一个需要装饰类的对象;为什么我们需要继承需要装饰的类呢?我们可以看到在时间调用的时候,我们的方法可以实现我被装饰类的方法一样的调用。我们在Decorator类中的Operation()方法放中,调用被装饰的类的方法。我们的具体的ConcreteDecoratorA 和ConcreteDecoratorB 则是具体的装饰类,我们可以在该类的Operation()方法中去特殊化一些操作(注意:这个地方在注意的时候,需要调用父类的方法:base.Operation()).

    我们先贴出代码,后续再做分析:

//Component 类
abstract class Component
{
	public abstract Operation();
}

//ConcreteComponent 类
class ConcreteComponent :Component
{
    public override void Operation()
	{
		Console.WriteLine("具体对象的操作");
	}
}

//Decorator 类
abstract class Decorator:Component
{
	protected Component component;
	//设定具体的虚包装的类对象
	public void setComponent(Component component)
	{
		this.component=component;
	}
	public  override void Operation()
	{
		if(component!=null)
		{
           component.Operation();
		}
	}
}
// ConcreteDecoratorA 类
class ConcreteDecoratorA:Decorator
{
	 private string addedState;
	//在继承的过程中拥有了setComponent方法;
    public  override void Operation()
	{
		base.Operation();
		//执行此装饰器特殊的指令
		addedState="XXXXXXX";

	}
}
//ConcreteDecoratorB 类
class ConcreteDecoratorB:Decorator
{
	//在继承的过程中拥有了setComponent方法;
    public  override void Operation()
	{
		AddedBehavior();//执行特殊的指令
		base.Operation();

	}
	public void AddedBehavior()
	{
		//具体特殊代码的编写处
	}
}


//客户端
class  
{
	public static void main(String[] args) 
	{
		ConcreteComponent c=new ConcreteComponent();
		ConcreteDecoratorA d1=new ConcreteDecoratorA();
		ConcreteDecoratorB d2=new ConcreteDecoratorB();
		d1.setComponent(c);
		d2.setComponent(d1);
		d2.Operation();

	}
}
        从客户端代码部分,我们可以看到:装饰模式实际上就是用setComponent方法来进行对象的包装;这样实现了装饰对象和如何使用装饰对象分离了;每个装饰的对象只需要关心自己的功能就OK了;

装饰器模式的设计原理

标签:

原文地址:http://blog.csdn.net/sevenkj/article/details/42387395

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!