模板方法模式通过抽象类定义算法骨架,将可变步骤延迟至子类实现,核心是“父类定流程,子类填细节”;模板方法为final,调用abstract步骤或可选钩子方法,确保流程稳定且支持扩展。

模板方法模式在抽象类中通过定义算法骨架、将可变步骤延迟到子类实现来达成。核心是“父类定流程,子类填细节”。
定义抽象模板类,封装不变逻辑
在抽象类中声明一个 final 方法(即模板方法),它按固定顺序调用若干抽象或钩子方法。这些被调用的方法由子类具体实现,而模板方法自身不允许被重写,确保流程稳定。
- 模板方法通常命名如 execute()、process() 或 doOperation()
- 被延迟的方法用 abstract 声明(必须重写)或 protected 默认实现(可选重写,称“钩子方法”)
- 抽象类还可包含具体工具方法,供所有子类复用
子类继承并实现抽象步骤
子类只需关注自己负责的环节,不改变整体执行顺序。每个子类对同一模板方法的调用,会因各自实现不同而产生不同行为。
- 重写所有 abstract 方法,补全业务逻辑(例如:readData()、parseData()、saveResult())
- 按需覆写钩子方法(如 isLoggingEnabled()),控制条件分支
- 禁止重写模板方法本身(靠 final 保证)
运行时体现:多态驱动流程执行
客户端只面向抽象类编程,传入任意子类实例,调用模板方法即可触发完整流程。JVM 根据实际类型动态绑定各步骤的具体实现。
- 例如:new PdfReportGenerator().execute() 和 new ExcelReportGenerator().execute() 共享同一模板,但输出格式不同
- 新增子类无需修改原有代码,符合开闭原则
- 算法结构集中管理,避免重复和错序
注意边界:合理划分抽象与具体职责
不是所有方法都该抽象——只把**易变、差异化大、与子类强相关**的部分抽出去;通用校验、资源清理、日志统一封装在模板方法内更稳妥。
- 避免过度抽象:一个 abstract 方法只做一件事,粒度适中
- 警惕空实现:若某钩子方法在多数子类中都不需要重写,考虑是否应默认为 false 或提供空体
- 可配合策略模式处理极端复杂的步骤变体,保持模板类轻量

















