装饰器
所谓装饰,就是锦上添花,首先要有本体存在,而且在不破坏本体的情况下给本体添砖加瓦。
下面写个简单的例子:
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();
总结:
这里以最简单的方式实现了装饰器,当然实际应用中要复杂得多,万变不离其宗,也是对象与对象之间一层套一层,加一层就复杂一点,加一层就复杂一点。在有业务需要的情况下多层加套带来的复杂程度递增,程序的扩展性也会更好。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)