结构型设计模式——装饰器模式
在不修改原有对象代码的情况下,通过“装饰器”类动态添加一些额外的职责。就功能而言,Decorator模式比生成子类更灵活。
适用于
①在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
②处理那些可以撤销的职责
③当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立地扩展,为支持一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,由于类定义被隐藏,或者类定义不能用于生成子类。
类图如下

1 internal class Program 2 { 3 static void Main(string[] args) 4 { 5 ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA(new ConcreteDecoratorB(new ConcreteComonent())); 6 7 concreteDecoratorA.Operation(); 8 } 9 }
1 /// <summary> 2 /// 构建类(可以是abstract类型,接口扩展更灵活) 3 /// </summary> 4 /// 就是为这个类动态添加一些职责或者功能 5 internal interface Comonent 6 { 7 void Operation(); 8 }
1 /// <summary> 2 /// 装饰器类,继承并且组合需要扩展的类 3 /// </summary> 4 internal abstract class Decorator : Comonent 5 { 6 private Comonent comonent; 7 8 protected Decorator(Comonent comonent) 9 { 10 this.comonent = comonent; 11 } 12 13 public virtual void Operation() 14 { 15 comonent.Operation(); 16 } 17 }
1 /// <summary> 2 /// 具体装饰器类,实现具体扩展职责,按照维度可以是不同的类 3 /// </summary> 4 internal class ConcreteDecoratorA : Decorator 5 { 6 public ConcreteDecoratorA(Comonent comonent) : base(comonent) 7 { 8 } 9 10 public override void Operation() 11 { 12 base.Operation(); 13 Console.WriteLine("添加职责A"); 14 } 15 }
1 internal class ConcreteDecoratorB : Decorator 2 { 3 public ConcreteDecoratorB(Comonent comonent) : base(comonent) 4 { 5 } 6 7 public override void Operation() 8 { 9 base.Operation(); 10 Console.WriteLine("添加职责B"); 11 } 12 }
1 /// <summary> 2 /// 需要添加职责的具体类 3 /// </summary> 4 internal class ConcreteComonent : Comonent 5 { 6 public void Operation() 7 { 8 Console.WriteLine("基础功能"); 9 } 10 }

浙公网安备 33010602011771号