什么是装饰器模式?动态地给一个对象添加一些额外的工作职责,就增加功能来说,装饰器模式比继承的子类更灵活。
从以上图我们可以看到:最核心的类就是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了;