所谓装饰,就是锦上添花,首先要有本体存在,而且在不破坏本体的情况下给本体添砖加瓦。

下面写个简单的例子:

   public abstract class BaseAction
    {
        public abstract void Action();
    }

上面的本体很简单,名字也很随意,可以套个接口什么,我这里最简单的以抽象类展示了。

 public abstract class BaseDecorator: BaseAction
    {
        private BaseAction _action;
        public BaseDecorator(BaseAction baseAction)
        {
            _action = baseAction;
        }

        public override void Action()
        {
            _action.Action();
        }

    }

上面的BaseDecorator就是一个装饰的基类,这里就是包装本体的类,通过这个类我们可以不用改动本体的情况下在本体执行前后做AOP动作。当然这里用到了继承和组合,比较经典的一个骚操作。

下面的实现就是随意发挥了,这里弄了两个本体,如下:

  public class StartAction : BaseAction
    {
        public override void Action()
        {
            Trace.WriteLine("base start");
        }
    }

    public class EndAction : BaseAction
    {
        public override void Action()
        {
            Trace.WriteLine("base end");
        }
    }

下面分别为每个本体弄一个开始和结束的动作

  public class BeforeStart : BaseDecorator
    {
        public BeforeStart(BaseAction baseAction) : base(baseAction)
        {
        }

        public override void Action()
        {
            Trace.WriteLine("before start");
            base.Action();
        }
    }

    public class AfterStart : BaseDecorator
    {
        public AfterStart(BaseAction baseAction) : base(baseAction)
        {
        }

        public override void Action()
        {
            base.Action();
            Trace.WriteLine("after start");
        }
    }

 

 public class BeforeEnd : BaseDecorator
    {
        public BeforeEnd(BaseAction baseAction) : base(baseAction)
        {
        }

        public override void Action()
        {
            Trace.WriteLine("before end");
            base.Action();
        }
    }

    public class AfterEnd : BaseDecorator
    {
        public AfterEnd(BaseAction baseAction) : base(baseAction)
        {
        }

        public override void Action()
        {
            base.Action();
            Trace.WriteLine("after end");
        }
    }

客户端代码如下:

 BaseAction start = new StartAction();
            start = new BeforeStart(start);
            start = new AfterStart(start);
            start.Action();

            BaseAction end = new EndAction();
            end = new BeforeEnd(end);
            end = new AfterEnd(end);
           end.Action();

总结:

这里以最简单的方式实现了装饰器,当然实际应用中要复杂得多,万变不离其宗,也是对象与对象之间一层套一层,加一层就复杂一点,加一层就复杂一点。在有业务需要的情况下多层加套带来的复杂程度递增,程序的扩展性也会更好。