【转载】http://www.cnblogs.com/lmfeng/archive/2012/07/19/2598670.html
需要把所需的功能按照正确的顺序串联起来进行控制,动态的给一个对象添加一些额外的职责。
装饰模式是利用SetComponent来对对象进行包装的,每一个装饰对象只需关心自己的功能,不需要关心如何被添加到对象链中。
装饰模式是为已有功能动态添加其他功能的一种方式,优点是把类中的装饰功能从类中搬移,简化原有类,有效的把核心职责和装饰职责功能区分开来。
调用装饰模式的主函数:
static void Main(string[] args)
{
ConcreteComponent c = new ConcreteComponent();//核心功能类
ConcreteDecoratorA d1 = new ConcreteDecoratorA();//装饰类1
ConcreteDecoratorB d2 = new ConcreteDecoratorB();//装饰类2
d1.SetComponent(c);
d2.SetComponent(d1);
d2.Opration();//会执行核心功能类+装饰类1+装饰类2
Console.ReadKey();
}
{
ConcreteComponent c = new ConcreteComponent();//核心功能类
ConcreteDecoratorA d1 = new ConcreteDecoratorA();//装饰类1
ConcreteDecoratorB d2 = new ConcreteDecoratorB();//装饰类2
d1.SetComponent(c);
d2.SetComponent(d1);
d2.Opration();//会执行核心功能类+装饰类1+装饰类2
Console.ReadKey();
}
核心功能类和装饰类继承的抽象类Component:
public abstract class Component
{
public abstract void Opration();
}
{
public abstract void Opration();
}
核心类ConcreteComponent :
public class ConcreteComponent : Component
{
public override void Opration()
{
Console.WriteLine("ConcreteComponent类的操作");
}
}
{
public override void Opration()
{
Console.WriteLine("ConcreteComponent类的操作");
}
}
装饰模式是利用SetComponent来对对象进行包装的,每一个装饰对象只需关心自己的功能,不需要关心如何被添加到对象链中。
Decorator类实现了SetComponent方法,接受核心功能对象,在Decorator类的子类中重写Opration方法,实现功能的叠加。
public abstract class Decorator : Component
{
protected Component component;
public void SetComponent(Component component)
{
this.component = component;
}
public override void Opration()
{
if (component != null)
{
component.Opration();
}
}
}
{
protected Component component;
public void SetComponent(Component component)
{
this.component = component;
}
public override void Opration()
{
if (component != null)
{
component.Opration();
}
}
}
装饰类:(继承Decorator,拥有了SetComponent方法,来接受需要增加功能的对象,重写Opration方法就是增加功能的依据)
public class ConcreteDecoratorA : Decorator
{
public override void Opration()
{
base.Opration();//就是通过这个语句实现功能块叠加
Console.WriteLine("ConcreteDecoratorA类的操作");
}
}
{
public override void Opration()
{
base.Opration();//就是通过这个语句实现功能块叠加
Console.WriteLine("ConcreteDecoratorA类的操作");
}
}
public class ConcreteDecoratorB : Decorator
{
public override void Opration()
{
base.Opration();//就是通过这个语句实现功能块叠加
Console.WriteLine("ConcreteDecoratorB类的操作");
}
}
{
public override void Opration()
{
base.Opration();//就是通过这个语句实现功能块叠加
Console.WriteLine("ConcreteDecoratorB类的操作");
}
}