1.概述
装饰者模式,英文名叫做Decorator Pattern。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
2.特点
/// <summary> /// 定义Component对象接口 /// </summary> public abstract class Component { public abstract void Operation();//一个抽象的职责 } /// <summary> /// 具体对象 /// </summary> class ConcreteComponent : Component { public override void Operation() { Console.WriteLine("具体对象的操作"); } } //装饰者抽象类 abstract class Decorator : Component { protected Component component; public void SetComponent(Component component) { this.component = component; } public override void Operation() { if (component != null) { component.Operation(); } } } class ConcreteDecoratorA : Decorator { public override void Operation() { base.Operation(); //首先运行原Compnent的Operation(),再执行本类的功能,如AddedBehavior,相当于对原Component进行了装饰 Console.WriteLine("具体装饰对象A的操作"); } } class ConcreteDecoratorB : Decorator { public override void Operation() { base.Operation(); //首先运行原Compnent的Operation(),再执行本类的功能,如AddedBehavior,相当于对原Component进行了装饰 Console.WriteLine("具体装饰对象B的操作"); } }
(2)无抽象接口
public class Car { public virtual void Description() { Console.Write("基本"); } } public class ESPDecorator : Car { Car car; public ESPDecorator(Car car) { this.car = car; } public override void Description() { car.Description(); Console.WriteLine("带有ESP功能"); } } public class OtherDecorator : Car { Car car; public OtherDecorator(Car car) { this.car = car; } public override void Description() { car.Description(); Console.WriteLine("带有其它功能"); } }
代码调用
//第一种 ConcreteComponent c = new ConcreteComponent(); ConcreteDecoratorA d1 = new ConcreteDecoratorA(); d1.SetComponent(c); ConcreteDecoratorB d2 = new ConcreteDecoratorB(); d2.SetComponent(c); d2.Operation(); //第二种 Car car = new ESPDecorator(new OtherDecorator(new Car())); car.Description(); Console.Read();
C#设计模式之装饰者模式(Decorator Pattern)
原文:http://www.cnblogs.com/loui/p/Decorator.html