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