装饰模式(Decorator),动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
“在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。”
装饰模式是为已有功能动态的添加更过功能的一种方式,比继承更加灵活,通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。但是会出现小类,增加程序的复杂性。
//对象 可以给这些对象动态的添加职责 /// <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(); AddedBehavior(); Console.WriteLine("具体装饰对象B的操作"); } private void AddedBehavior() { Console.WriteLine("具体装饰对象B独有的操作"); } }
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(); Console.Read(); }