1. 模板方法模式概述
在软件开发中,我们经常会遇到这样的情况:多个算法或操作具有相同的骨架,但某些步骤的具体实现可能不同。模板方法模式(Template Method Pattern)就是一种行为型设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。这种模式允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。
我第一次接触模板方法模式是在开发一个跨平台文件处理工具时。当时需要支持多种文件格式(PDF、Word、Excel等),每种格式的处理流程基本相同(打开文件→读取内容→转换格式→保存结果),但每个步骤的具体实现却因格式而异。如果为每种格式都写一套完整流程,代码会大量重复;而使用模板方法模式后,代码复用率提高了60%以上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模式结构与核心组件
2.1 UML类图解析
模板方法模式的核心结构非常简单但非常有效:
code复制AbstractClass(抽象类)
|—— templateMethod() // 模板方法,定义算法骨架
|—— primitiveOperation1() // 抽象方法,由子类实现
|—— primitiveOperation2() // 抽象方法,由子类实现
|—— hook() // 钩子方法,可选覆盖
ConcreteClass(具体子类)
|—— primitiveOperation1() // 实现具体步骤
|—— primitiveOperation2() // 实现具体步骤
在实际项目中,我通常会这样使用:
- 抽象类定义模板方法和基本方法
- 基本方法分为三种:
- 抽象方法:必须由子类实现
- 具体方法:已经实现的方法
- 钩子方法:可选实现的方法
2.2 关键角色详解
抽象类(AbstractClass):
- 定义并实现模板方法,通常用final修饰防止子类重写
- 声明抽象方法作为算法步骤
- 可以提供默认实现或空实现作为钩子方法
具体子类(ConcreteClass):
- 实现父类定义的抽象方法
- 可选择性地覆盖钩子方法
- 不应该重写模板方法(所以模板方法通常声明为final)
提示:在Java中,抽象类不一定需要包含抽象方法,但包含抽象方法的类必须声明为抽象类。这个特性在模板方法模式中非常有用。
3. 模式实现与代码示例
3.1 Java实现示例
让我们通过一个实际的银行交易处理例子来说明。假设我们需要处理不同类型的银行交易(存款、取款、转账),它们都有相同的处理流程但具体实现不同。
java复制// 抽象交易处理器
public abstract class TransactionProcessor {
// 模板方法 - 定义交易处理流程
public final void processTransaction() {
validate();
execute();
updateBalance();
sendNotification();
logTransaction();
}
// 必须由子类实现的方法
protected abstract void validate();
protected abstract void execute();
// 可选覆盖的方法(钩子方法)
protected void sendNotification() {
// 默认发送短信通知
System.out.println("Sending SMS notification...");
}
// 公共方法
private v
