设计模式(1)装饰模式总结


概述


动态为对象添加额外的功能,相对以前利用子类继承来增加父类的功能来说。装饰模式更为简洁、灵活,更符合面向


对象的原则。


装饰模式结构图

在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、在装饰过程过长的情况下,影响执行效率。

原文地址:https://www.cnblogs.com/guziming/p/4232752.html