Java抽象类模板方法模式通过final模板方法锁死流程顺序,将易变逻辑交由protected abstract方法实现,配合钩子方法与依赖注入提升扩展性与可观测性。

Java 中抽象类模板方法模式规范业务流程,关键在于用抽象类把“不变的顺序”锁死,把“易变的逻辑”交给子类填空,既防错序又保扩展。
定义带 final 模板方法的抽象骨架
在抽象类中声明一个 final 方法(如 execute() 或 process()),它按严格顺序调用多个步骤。这个方法就是流程总控,不能被子类修改。
- 模板方法内只调用本类可见的方法:
protected abstract步骤、protected final工具方法、或带默认实现的钩子方法 - 所有核心差异点必须声明为
protected abstract,比如validateRequest()、fetchApprover()、persistResult() - 避免在模板方法中调用可被重写的方法(尤其是构造器里),防止半初始化对象引发 NPE
合理划分抽象方法与钩子方法
抽象方法是硬性契约,钩子方法是柔性开关——两者语义不同,不能混用。
- 抽象方法:子类必须实现,代表流程中不可省略、且行为差异大的环节(如审批规则、数据解析方式)
-
钩子方法:提供空实现或默认返回值,命名建议带
should、before、after前缀,例如shouldLogDetail()或afterSubmit() - 多数子类都不需覆盖的钩子,应设默认合理值(如
return false;),避免空实现泛滥
子类只实现必要逻辑,不碰流程控制
具体子类继承后,专注补全抽象方法,其他全部复用。新增业务类型只需加新子类,不改原有代码。
- 每个子类只覆盖自己关心的抽象方法,比如
LeaveApprovalProcess实现checkVacationBalance(),而PurchaseApprovalProcess实现verifyBudgetLimit() - 禁止重写模板方法本身(靠
final保障),也不应手动调用步骤方法打乱顺序 - 可复用的通用操作(如统一记录审批日志、更新单据状态)封装在抽象类的
protected final方法中,子类直接调用
配合上下文与运行时装配增强实用性
真实业务中流程常依赖动态数据和外部配置,模板类需支持灵活注入与可观测能力。
- 在抽象类构造器中接收上下文对象(如
ApprovalContext),供各步骤共享申请单、用户、组织等信息 - 结合 Spring,用
@Qualifier按类型注入不同子类 Bean,再通过工厂或策略模式按需选取流程实例 - 在模板方法关键节点插入统一异常处理、耗时监控和审计日志,例如每步执行前后记录时间戳与参数
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











