模板方法模式通过抽象类定义算法骨架,将可变步骤声明为抽象方法或带默认实现的钩子方法,并用final修饰模板方法确保流程不可覆盖;子类继承后仅需实现抽象方法、按需重写钩子,从而在不改变结构前提下定制行为。

模板方法模式通过抽象类定义算法骨架,把某些步骤延迟到子类中实现,让子类在不改变算法结构的前提下重新定义该算法的某些特定步骤。
抽象类定义模板方法和钩子操作
在抽象类中,用 final 修饰模板方法(如 execute()),确保子类不能覆盖整个流程;将可变部分声明为抽象方法(如 doStep1()、doStep2())或带默认实现的钩子方法(如 isLoggingEnabled())。这样既约束了执行顺序,又保留了扩展点。
子类继承并实现具体逻辑
子类只需继承抽象类,并实现所有抽象方法。钩子方法可选择性重写。例如:
- 抽象类定义
public final void process() { prepare(); executeCore(); cleanup(); } - 子类实现
prepare()连接数据库、executeCore()执行查询、cleanup()关闭连接 - 若某子类不需要日志,可重写
isLoggingEnabled()返回false
避免子类破坏模板流程
关键在于控制访问权限和方法修饰符:
- 模板方法必须是 public final,防止被重写
- 抽象步骤用 protected abstract,仅对子类可见且强制实现
- 钩子方法用 protected + 默认实现,子类按需覆盖
- 不要在抽象类构造器中调用抽象方法,否则运行时抛出
AbstractMethodError
结合具体场景增强实用性
比如报表生成系统:
- 抽象类
ReportGenerator定义generate()模板:加载数据 → 格式化 → 输出 → 发送通知 - 子类
PdfReportGenerator实现 PDF 格式化和文件输出 - 子类
HtmlReportGenerator实现 HTML 渲染和邮件发送 - 通知方式作为钩子,默认发邮件,
SlackReportGenerator可重写通知逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











