抽象类模板模式通过定义算法骨架,将可变步骤声明为抽象方法(强制子类实现)或钩子方法(可选重写),结合final模板方法封装不变逻辑,实现流程统一与扩展灵活。

抽象类模板模式通过定义算法骨架,把可变步骤声明为 抽象方法 或 钩子方法,强制或允许子类提供具体实现,从而将可变逻辑延迟到子类。
1. 抽象方法:强制子类实现核心变化点
在抽象类中用 abstract 修饰关键步骤,子类必须重写。这些是算法中“一定会变、且必须不同”的部分。
- 父类定义模板方法(
final防止被覆盖),按顺序调用抽象方法 - 子类继承后,实现每个抽象方法,注入自己的逻辑
- 例如:一个通用报表生成流程,
queryData()、formatData()、export()全部设为抽象方法,不同报表类型(销售/用户/订单)各自实现数据查询和格式化方式
2. 钩子方法(Hook Method):提供可选扩展点
声明为空的非抽象方法(默认空实现或返回默认值),子类按需重写。适合“可能变化、但不强制”的逻辑,比如日志、校验、前置/后置处理。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 在模板方法中调用钩子方法(如
beforeProcess()、afterSave()) - 子类选择性重写,不影响主流程;不重写则走默认空逻辑,无副作用
- 例如:支付流程中,
onPaymentSuccess()是钩子,优惠券发放、消息通知等可由特定子类决定是否介入
3. 具体方法 + final 模板方法:封装不变逻辑,暴露可变接口
把稳定的部分(如公共校验、事务开启、异常包装)写成 protected 或 private 具体方法,在 final 模板方法中统一调度。
- 模板方法本身用
final修饰,确保流程顺序不被破坏 - 所有可变环节只通过抽象方法或钩子方法向外暴露,内部细节对子类透明
- 这样既保证框架一致性,又让子类只关注“做什么”,不操心“怎么做”和“何时做”
4. 实际编码要点
避免常见误用,让延迟真正生效:
- 抽象方法不要有默认实现(那是钩子或具体方法的事)
- 钩子方法命名建议带
hook、on、before/after等前缀,语义清晰 - 模板方法里别直接 new 子类或调用子类特有方法——保持对抽象层的依赖
- 如果某个步骤只有两种实现,考虑用策略模式+组合替代继承,避免子类爆炸
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










