C#怎么实现装饰器模式_C# Decorator设计模式方法教程【技巧】
装配器模式在 C# 里到底怎么落地?很多人第一反应是找类似 Python 的 `@decorator` 语法糖,或者搜 `[Decorator]` 特性,结果折腾半天发现根本没有内置支持。其实核心思路特别简单:**不碰原类,靠接口 + 组合 + 委托动态加行为**。下面一步步拆开看,顺便把容易踩的坑
先别急着写代码,得先统一“可装饰”的入口。装饰器的本质是“同类型套一层”,所以必须有一个公共接口来定义契约。比如日志场景,先定义 `ILogger` 接口,所有具体实现(原始类、装饰器类)都实现它:
```csharp
public interface ILogger
{
void Log(string message);
}
```
这里有个容易犯的错误:有人试图用抽象类代替接口,结果装饰器既不能继承原始实现,又没法独立扩展,最后搞出奇怪的继承树。还有的直接从 `FileLogger` 派生 `TimestampLogger`,这种写法只能装饰固定一类,完全失去复用价值。记住:接口是必须的,抽象类不行。
写装饰器类:组合 + 转发 + 增强
装饰器本身是个具体类,构造时接收一个 `ILogger` 实例——这实例可以是原始实现,也可以是另一个装饰器。然后在自己的 `Log` 方法里先做增强逻辑,再调用被装饰对象的 `Log` 转发下去: ```csharp public class TimestampLogger : ILogger { private readonly ILogger _inner; public TimestampLogger(ILogger inner) => _inner = inner; public void Log(string message) { var stamped = $"[{DateTime.Now:HH:mm:ss}] {message}"; _inner.Log(stamped); // 转发给下一层 } } ``` 几个关键点:构造函数参数必须用接口类型(`ILogger`),不能用 `ConsoleLogger` 这种具体类;装饰器内部不 `new` 任何具体实现,靠外部注入,否则就没法链式嵌套。增强逻辑可以放在转发前(前置处理),也可以放在转发后(后置处理),甚至可以直接拦截不转发——比如权限装饰器判断不通过就直接 `return`。运行时组装装饰器链,别硬编码
装饰器的价值在于灵活组合,别写死成 `new TimestampLogger(new FileLogger())` 这种固定链。推荐用工厂方法或者依赖注入容器来管理。手动组装示例(适合测试或简单场景): ```csharp ILogger logger = new TimestampLogger( new RetryLogger( new ConsoleLogger())); ``` 如果用了 `Microsoft.Extensions.DependencyInjection`,注意注册顺序:最后注册的装饰器最先执行(因为它是最外层)。比如: ```csharp services.AddSingleton容易被忽略的性能与生命周期问题
每层装饰器都是一次对象分配和虚方法调用。如果日志频率很高(比如每毫秒一次),堆栈深度超过5层就可能引发 GC 压力,间接影响吞吐。更隐蔽的问题:装饰器若持有 `IDisposable` 资源(比如打开文件流),必须确保整个链能正确释放——接口本身没继承 `IDisposable`,得自己约定,或者额外封装一个 `IDisposableLogger`。 另外,装饰器里的状态(比如计数器、缓存)是否该跨请求共享?多数场景应该无状态,否则多线程下容易出错;真要状态的话,得用 `AsyncLocal
WPS Office是一款面向macOS用户的综合办公套件,将文字处理、电子表格、演示文稿、PDF工具、模板与云协作整合在同一应用中。它兼容常见Microsoft Office格式,支持Intel及Apple芯片Mac,基础功能可免费使用,
Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。
REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。
Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理工具,可在 Windows 上完成照片修饰、选区抠图、图层合成、文字排版、绘画及生成式编辑。软件采用订阅授权,由 Creative Cloud 管理安装、更新与许
Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator
Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。













