前言
装饰模式(Decorator),动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
一、Component抽象类
1 public abstract class Component2 {3 public abstract void Operationa();4 }
Component 定义一个对象接口,可以给这些对象动态地添加职责
二、ConcreteComponent具体对象类
1 public class ConcreteComponent : Component2 {3 public override void Operationa()4 {5 Console.WriteLine("具体对象的操作");6 }7 }
ConcreteComponent 定义了一个具体的对象,也可以给这个对象添加一些职责
三、Decorator装饰抽象类
1 { 2 abstract class Decorator : Component 3 { 4 protected Component component; 5 6 public void SetComponent(Component component) 7 { 8 this.component = component; 9 }10 public override void Operationa()11 {12 if(component != null)13 {14 component.Operationa();15 }16 }17 }
Decorator装饰抽象类,继承Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的
四、ConcreteDecorator具体的装饰对象
1 class ConcreteDecoratorA : Decorator 2 { 3 private string addedState; 4 public override void Operationa() 5 { 6 base.Operationa(); 7 addedState = "A New State"; 8 Console.WriteLine("具体装饰对象A的操作"); 9 }10 }11 class ConcreteDecoratorB : Decorator12 {13 public override void Operationa()14 {15 base.Operationa();16 AddedBehavior();17 Console.WriteLine("具体装饰对象B的操作");18 }19 20 private void AddedBehavior()21 {22 //Console.WriteLine("B New State");23 }24 }
ConcreteDecorator具体的装饰对象,起到给Component添加职责的功能。
五、运行
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 ConcreteComponent c = new ConcreteComponent(); 6 ConcreteDecoratorA a = new ConcreteDecoratorA(); 7 ConcreteDecoratorB b = new ConcreteDecoratorB(); 8 9 c.Operationa();10 Console.WriteLine("===================");11 a.SetComponent(c);12 a.Operationa();13 Console.WriteLine("===================");14 b.SetComponent(a);15 b.Operationa();16 17 Console.ReadKey();18 }19 }
显示结果:
具体对象的操作===================具体对象的操作具体装饰对象A的操作===================具体对象的操作具体装饰对象A的操作具体装饰对象B的操作
总结:
1、装饰模式是利用SetComponent来对对象进行包装的。这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。
2、使用:当系统需要新功能的时候,是向旧类中添加新的代码。这些新加的代码通常装饰了原类的核心职责或主要行为。
在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。这些新加入的东西仅仅是为了满足一些只在某种特定的情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中。
因此,当需要执行特殊行为时,客户端代码就可以在运行时根据需要有选择的,按顺序的使用装饰功能包装对象。
3、优点:把类中的装饰功能从类中移除,这样可以简化原有类。这样可以有效地把类的核心职责和装饰功能分开,而且可以去除相关类中的重复装饰逻辑。
参考书籍:大话设计模式