首页 > 代码库 > 设计模式 装饰模式

设计模式 装饰模式

装饰模式(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();        }
装饰模式具体实现

 

设计模式 装饰模式