概述
动态为对象添加额外的功能,相对以前利用子类继承来增加父类的功能来说。装饰模式更为简洁、灵活,更符合面向
对象的原则。
装饰模式结构图
在Decorator类中,通过SetComponent构造函数来对Component对象进行设置,从而扩展Component的功能,
namespace 装饰模式 { class Program { static void Main(string[] args) { ConcreteComponent c = new ConcreteComponent(); ConcreteDecoratorA a = new ConcreteDecoratorA(); ConcretedDecoratorB b = new ConcretedDecoratorB(); a.SetComponent(c); b.SetComponent(a); b.Operation(); Console.ReadLine(); } } //Component类 abstract class Component { public abstract void Operation(); } //ConcreteComponet类 class ConcreteComponent : Component { public override void Operation() { Console.WriteLine("具体对象的操作!!!") ; } } //Decorator类 abstract class Decorator : Component { //设置Component protected Component component; public void SetComponent (Component component) { this.component = component; } public override void Operation() { if (component != null) { component.Operation(); } } } //ConcreteDecoratorA类 class ConcreteDecoratorA :Decorator { private string addedState; public override void Operation() { base.Operation(); addedState = "标识A的操作,以区别操作B!!!"; Console.WriteLine ("具体对象A的操作!!!"); } } //ConcreteDecoratorB类 class ConcretedDecoratorB : Decorator { private string removeState; public override void Operation() { base.Operation(); removeState = "标识操作B,以区别操作A!!!"; Console.WriteLine("具体对象B的操作!!!"); } } }
最后调用的实际上是Component的方法。
运行结果
特点
1、通过组合而非继承的方式,实现了动态扩展对象的功能的能力
2、有效避免了使用继承的方式扩展对象功能而带来的灵活性差,子类无限制扩张的问题
3、充分利用了继承和组合的长处和短处,在灵活性和扩展性之间找到完美的平衡点
4、装饰者和被装饰者之间虽然都是同一类型,但是它们彼此是完全独立并可以各自独立任意改变的
5、遵守大部分grasp原则和常用设计原则,高内聚、低偶合
6、在装饰过程过长的情况下,影响执行效率。