天高地厚

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

装饰者模式

Posted on 2012-12-18 14:35  天高地厚-GNU  阅读(93)  评论(0编辑  收藏  举报

【转载】http://www.cnblogs.com/lmfeng/archive/2012/07/19/2598670.html

需要把所需的功能按照正确的顺序串联起来进行控制,动态的给一个对象添加一些额外的职责。
装饰模式是利用SetComponent来对对象进行包装的,每一个装饰对象只需关心自己的功能,不需要关心如何被添加到对象链中。
装饰模式是为已有功能动态添加其他功能的一种方式,优点是把类中的装饰功能从类中搬移,简化原有类,有效的把核心职责和装饰职责功能区分开来。

调用装饰模式的主函数:

 

        static void Main(string[] args)
        {
            ConcreteComponent c = new ConcreteComponent();//核心功能类
            ConcreteDecoratorA d1 = new ConcreteDecoratorA();//装饰类1
            ConcreteDecoratorB d2 = new ConcreteDecoratorB();//装饰类2
            d1.SetComponent(c);
            d2.SetComponent(d1);
            d2.Opration();//会执行核心功能类+装饰类1+装饰类2
            Console.ReadKey();
        }

 

核心功能类和装饰类继承的抽象类Component:

 

 

    public abstract class Component
    {
        public abstract void Opration();
    }

 

 核心类ConcreteComponent :

 

 

    public class ConcreteComponent : Component
    {
        public override void Opration()
        {
            Console.WriteLine("ConcreteComponent类的操作");
        }
    }

 

 

装饰模式是利用SetComponent来对对象进行包装的,每一个装饰对象只需关心自己的功能,不需要关心如何被添加到对象链中。

Decorator类实现了SetComponent方法,接受核心功能对象,在Decorator类的子类中重写Opration方法,实现功能的叠加。

 

    public abstract class Decorator : Component
    {
        protected Component component;

        public void SetComponent(Component component)
        {
            this.component = component;
        }
        public override void Opration()
        {
            if (component != null)
            {
                component.Opration();
            }
        }
    }

 

装饰类:(继承Decorator,拥有了SetComponent方法,来接受需要增加功能的对象,重写Opration方法就是增加功能的依据)

 

    public class ConcreteDecoratorA : Decorator
    {
        public override void Opration()
        {
            base.Opration();//就是通过这个语句实现功能块叠加
            Console.WriteLine("ConcreteDecoratorA类的操作");
        }
    }
    public class ConcreteDecoratorB : Decorator
    {
        public override void Opration()
        {
            base.Opration();//就是通过这个语句实现功能块叠加
            Console.WriteLine("ConcreteDecoratorB类的操作");
        }
    }