装饰器模式通过组合动态扩展对象功能而不修改原类代码,核心是定义统一接口、装饰器持有组件引用并转发调用,在前后增强行为,支持运行时嵌套组装与独立测试。

装饰器模式的核心思想是通过组合而非继承来动态地为对象添加新功能,完全不需要改动原有类的代码。
用接口统一行为契约
先定义一个组件接口(比如 Component),所有原始类和装饰器都实现它。原始类(如 ConcreteComponent)只专注自身职责;装饰器(如 Decorator)持有该接口的引用,把调用转发给被装饰对象,再在前后插入新逻辑。
- 原始类不依赖任何装饰器,也不需要知道是否被包装
- 新增功能只需写新的装饰器类,实现同一接口,重写对应方法
- 多个装饰器可以层层嵌套,比如日志装饰器套缓存装饰器套权限装饰器
构造时注入,运行时组装
装饰器通常通过构造函数接收被装饰对象,这样组合关系在运行时决定,而不是编译期固化。例如:
这种写法让功能叠加清晰可见,也便于单元测试——你可以单独测每个装饰器,也可以用 mock 替换底层实现。
避免侵入式修改的关键点
- 原始类保持 final 或不暴露继承点,防止被意外继承破坏封装
- 装饰器不覆盖原始类的内部状态,只增强行为,不改变数据结构
- 如果原始类已有大量子类,装饰器仍可作用于接口或抽象父类,无需逐个适配
和继承、代理的区别要拎清
继承会提前绑定功能,且易导致类爆炸;而装饰器支持运行时按需叠加。它也不是简单代理——代理侧重控制访问(如远程、延迟),装饰器侧重增强职责。两者都用组合,但意图不同:一个“替你做事”,一个“帮你多做点事”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











