装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生产子类更为灵活
当系统需要更新新的功能的时候,通常是向旧的类中增加新的代码,这些新加的代码通常装饰了原有类的核心职责或者主要行为,但是这种做法的问题在于,它在主类中增加的新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,就像一个“人”类一样,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为需要,
然而,装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它索要装饰的对象,因此,当需要执行特殊行为时,客户端代码就可以在运行时根据需要有选择的,按顺序的使用装饰功能包装对象了。
namespace 装饰模式 { class Program { static void Main(string[] args) { //创建积累 ConcreteComponent c = new ConcreteComponent(); //定义只能1 ConcreteDecoratorA d1 = new ConcreteDecoratorA(); //定义只能2 ConcreteDecoratorB d2 = new ConcreteDecoratorB(); //增加附能 d1.SetComponent(c); d2.SetComponent(d1); d2.Operation(); Console.Read(); } } /// <summary> /// 定义对象积累 /// </summary> abstract class Component { public abstract void Operation(); } /// <summary> /// 具体对象的操作 /// </summary> class ConcreteComponent : Component { public override void Operation() { Console.WriteLine("具体对象的操作"); } } /// <summary> /// 定义抽象类,实现重写基类 /// </summary> abstract class Decorator : Component { protected Component component; //传入基类 public void SetComponent(Component component) { this.component = component; } //返回当前传入的积累 public override void Operation() { if (component != null) { component.Operation(); } } } /// <summary> /// 实现重写类A /// </summary> class ConcreteDecoratorA : Decorator { private string addedState; public override void Operation() { //首先调用父类执行 base.Operation(); //然后调用自身方法执行 addedState = "New State"; Console.WriteLine("具体装饰对象A的操作"); } } /// <summary> /// 实现重写类B /// </summary> class ConcreteDecoratorB : Decorator { public override void Operation() { base.Operation(); //首先调用父类执行 base.Operation(); //然后调用自身方法执行 AddedBehavior(); Console.WriteLine("具体装饰对象B的操作"); } private void AddedBehavior() { } } }