抽象装饰器基类通过持有final组件引用、强制构造注入、校验非空、默认委托所有方法并提供模板钩子,统一管理共享字段与增强逻辑,确保装饰链不可变与职责单一。

用抽象类实现装饰器模式的基类,关键在于统一接口、封装委托逻辑、约束子类行为。它不是为了替代接口,而是当多个装饰器需共享字段、共用辅助方法或强制初始化流程时,提供更严格的结构控制。
抽象装饰器基类必须持有被装饰对象引用
这是装饰器模式的基石。抽象类需定义一个受保护的组件字段,并通过构造器强制注入——确保每个具体装饰器在创建时都明确包装了目标对象。
- 字段声明为 final 或至少 protected,避免子类意外篡改引用
- 构造器中校验传入对象非 null,防止空指针隐患
- 不暴露 setter 方法,保证装饰链的不可变性
所有业务方法默认委托,但留出增强钩子
抽象基类应完整实现组件接口的所有方法,且默认行为均为调用被装饰对象对应方法。这不是“摆设”,而是为子类提供安全起点。
- 每个方法体里只写一行:return component.xxx(...) 或 component.xxx(...)
- 若某方法需前置/后置逻辑,可定义模板方法(如 beforeOperation() / afterOperation()),由子类选择性重写
- 避免在基类中添加具体业务逻辑,否则会污染复用性
规范变量行为需靠字段 + 模板方法组合
所谓“变量行为增强”,实际是指对某些可配置的执行环节做定制。抽象基类可通过定义 protected 字段 + 模板方法来统一管理。
- 例如定义 protected boolean enableCache = true;子类可在构造器中设置,基类在 getCost() 中根据该值决定是否走缓存分支
- 再如定义 protected Logger logger = LoggerFactory.getLogger(Decorator.class),供所有子类直接使用统一日志实例
- 关键点:字段命名体现意图(enableXxx、strategy、formatter),而非 genericValue 这类模糊名称
具体装饰器只专注自身职责,不做跨层耦合
子类继承抽象基类后,只需重写需要增强的方法,在调用 super.xxx() 前后插入逻辑即可。它不应关心其他装饰器是否存在,也不该尝试访问兄弟类的字段。
- 比如 LoggingDecorator 只负责打日志,不判断当前是否已启用缓存
- 比如 CachingDecorator 只负责查缓存、存缓存,不主动触发日志输出
- 叠加顺序由客户端控制(new CachingDecorator(new LoggingDecorator(new SimpleCoffee()))),基类不干预

















