首页 > 其他分享 >装饰器

装饰器

时间:2022-11-14 22:01:16浏览次数:24  
标签:public start base Action BaseAction 装饰 baseAction

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

下面写个简单的例子:

   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();

总结:

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

标签:public,start,base,Action,BaseAction,装饰,baseAction
From: https://www.cnblogs.com/morec/p/16890596.html

相关文章

  • 软件设计模式白话文系列(九)装饰者模式
    1、描述通过把对象引入包含行为的特殊封装中来为对象增强功能的模式。2、模式结构与实现逻辑具体业务类:这个类的对象就是需要被装饰者模式加强的对象。需要实现抽象装......
  • python-装饰器
    装饰器:装饰器可以用来做什么?作用:可以在不修改功能函数内部代码的情况下,给功能函数进行扩展的新功能(对开放封闭原理)1.装饰器可以给当前的功能进行扩展......
  • 闭包与装饰器
    闭包:正常情况下,上例中a变量在return语句后,a变量会被释放。但由于内部inner函数继续调用a变量,导致a变量没有被释放。这种现象叫闭包defouter():a=1definner(......
  • Python之递归函数与装饰器
    Python之递归函数与装饰器文章目录​​Python之递归函数与装饰器​​​​递归的含义:​​​​python中的时间模块​​​​装饰器​​递归函数在函数内部,可以调用其他函数。如......
  • python装饰器
    函数式编程复习:defmap_test(func,array):array_new=[]foriinarray:array_new.append(func(i))returnarray_newprintmap_test(lambdax:x**2,rang......
  • typescript装饰器
    属性装饰器参数exportdefaultfunction(proto,key){//两个参数}给属性增加metadataimport'reflect-metadata';exportdefaultfunction(label,type?......
  • python基础(三)装饰器
    字典推导式:data_list=['1hello','2world']result={item.split("")[0]:item.split("")[1]foritemindata_list}print(result)data='wd=搜狗&rsv_spt=1&r......
  • 设计模式学习(九):装饰器模式
    设计模式学习(九):装饰器模式作者:Grey原文地址:博客园:设计模式学习(九):装饰器模式CSDN:设计模式学习(九):装饰器模式装饰器模式装饰器模式是一种结构型模式。顾名思义,就是对某......
  • HeadFirst设计模式-装饰者模式
     C++代码#pragmaonce#include<string>usingstd::string;classBeverage{public:Beverage(){}virtual~Beverage(){}......
  • python 函数装饰器
    #函数传入的参数可以是函数deffunc1():print('1')deffunc2(func):#func为函数func()print('2')func2(func1)#12 deffunc1(func):......