一句话理解:装饰器在保持原接口不变的前提下包装对象,按需叠加职责,比为每种功能组合创建子类更灵活。
它解决什么问题
武器可能同时拥有暴击、元素伤害和吸血效果。若用继承表达所有组合,会出现大量子类,而且组合顺序难以调整。装饰器把每项能力做成一个可嵌套包装层。
C# 示例:伤害修饰器
运行时自由组合:
顺序可能影响结果,因此应让规则明确可见并有测试覆盖。
与 Unity 组件的关系
给 GameObject 挂多个 Component 也是组合职责,但不自动等同于 GoF 装饰器。装饰器要求包装对象与被包装对象实现同一接口,并沿包装链转发调用。
适用场景
Buff、伤害修正、日志与重试、输入过滤、数据流处理。若功能组合固定且没有运行时变化,普通组合或一个清晰的类可能更简单。
与代理的区别
两者结构相似。装饰器的意图是增加职责,代理的意图是控制访问,例如缓存、延迟加载或权限检查。
小结
装饰器把“有哪些能力”从继承层级转成对象组合。它很灵活,但包装层过多会增加调试难度,应配合清晰的构建入口和命名。