装饰器模式的核心价值在于以组合方式为多态对象动态叠加能力,通过统一接口、抽象装饰器和具体装饰器分层实现正交功能组合与运行时解耦。

装饰器模式的核心价值,就在于它能以组合方式为多态对象“叠加能力”,而不是靠继承去固化行为。它不改变原有类结构,却能让一个对象在运行时拥有多种功能组合——比如一个文本处理器,既能高亮语法,又能自动保存,还能压缩传输,这些能力可以按需开启或关闭。
明确组件接口,统一多态契约
所有被装饰的对象和装饰器必须实现同一接口(如 Beverage、DataLoader 或 Shape)。这个接口就是多态的“契约”,确保调用方无需知道底层是原始对象还是层层包装后的对象。只要接口一致,就能无缝替换和嵌套。
- 接口方法应覆盖对象的核心行为(如
cost()、read()、draw()) - 避免在接口中暴露装饰器专属逻辑(如“是否已加密”),保持关注点分离
- 接口越小越稳定,利于后续扩展;过大则易违反接口隔离原则
用抽象装饰器统一包装逻辑
抽象装饰器(如 CondimentDecorator 或 DataLoaderDecorator)不是具体功能,而是“可插拔能力”的通用容器。它持有组件引用,并默认委托调用——这保证了装饰链的连贯性,也为子类留出增强空间。
- 构造时传入被装饰对象,建立 has-a 关系(非 is-a 继承)
- 重写方法时,先调用
wrapper.method(),再添加新逻辑(前置/后置/包裹) - 支持递归包装:一个装饰器可包装另一个装饰器,形成调用链
分层叠加具体装饰器,实现功能正交组合
每个具体装饰器只负责一件事(如加牛奶、加密、描红边框),彼此独立、互不耦合。这种正交设计让功能可以自由拼装:比如 new EncryptionDecorator(new CompressionDecorator(new FileDataLoader())) 就同时具备压缩与加密能力,顺序不同可能语义不同(先压后密 vs 先密后压)。
- 避免在具体装饰器中引入其他装饰器逻辑,保持单一职责
- 装饰器之间不依赖彼此,也不感知外部层级,仅与直接包装的对象交互
- 可通过工厂或构建器简化多层创建,降低客户端使用复杂度
运行时动态装配,真正解耦功能与实例
装饰器的价值在运行时才完全释放。你可以根据配置、用户选择或业务规则,决定加载哪些装饰器。例如:日志装饰器只在 debug 模式启用;缓存装饰器按请求路径开关;权限校验装饰器依角色动态挂载。
- 不需编译期确定功能组合,避免大量子类爆炸
- 支持装饰器热插拔(如通过反射或服务注册机制替换某一层)
- 结合依赖注入容器,可将装饰链声明为 Bean,由框架管理生命周期











