java中泛型装饰器模式的核心是让装饰器支持泛型参数以保障类型安全,其结构要求装饰器实现相同泛型接口、持有被装饰对象引用、透传泛型参数并复用方法,支持多层嵌套、类型推断及泛型方法声明。

Java 中泛型装饰器模式的核心,是让装饰器本身也支持泛型类型参数,从而在不破坏类型安全的前提下,对任意泛型组件进行动态功能增强。关键在于:装饰器类需声明与被装饰组件一致的泛型参数,并通过构造函数接收被装饰对象,再用组合方式复用其行为,同时叠加新逻辑。
泛型装饰器的基本结构
装饰器必须继承或实现与目标组件相同的接口(推荐接口),并携带相同泛型参数。例如组件接口为 Processor<t></t>,装饰器就应定义为 class LoggingProcessor<t> implements Processor<t></t></t>。
- 装饰器持有被装饰对象的引用(组合关系),而非继承
- 泛型参数
T在装饰器类声明时透传,确保方法签名类型一致 - 所有接口方法都调用被装饰对象的对应方法,再前后插入增强逻辑
支持多层嵌套与类型推断
泛型装饰器天然支持链式包装。只要每层装饰器都正确声明泛型,Java 编译器就能根据最内层组件推断整个链的类型。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 例如:
new TimingProcessor(new LoggingProcessor(new JsonProcessor())),若JsonProcessor是Processor<string></string>,整条链自动为Processor<string></string> - 使用静态工厂方法可进一步简化写法,如
LoggingProcessor.of(new JsonProcessor()),配合泛型方法推断避免冗余类型声明
处理泛型方法与通配符边界
当被装饰组件含有泛型方法(如 <r> R transform(T input)</r>)时,装饰器对应方法也需保留该泛型声明;若涉及子类型约束(如 Processor extends Number>),装饰器应使用相同上界或更宽泛的通配符以保持协变兼容性。
- 不要在装饰器中擅自缩小类型范围(如把
? extends Number改成Integer),否则会破坏原有契约 - 若需增强泛型方法行为(如缓存返回值),可在方法体内对
R做运行时判断,但编译期仍保持泛型擦除后的安全性
结合函数式接口实现轻量增强
对于简单增强逻辑(如日志、计时),可用 UnaryOperator<t></t> 或自定义函数式接口封装行为,再由通用装饰器统一应用,减少模板代码。
- 定义
Function<t t></t>类型的增强器列表,在装饰器process方法中依次 apply - 运行时动态添加/移除增强器,实现真正的“动态”能力(注意线程安全)
- 示例:
ChainedProcessor.of(target).addBefore(logBefore).addAfter(measureTime)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










