好的,阿杰,我们来系统讲解一下 行为型设计模式之一:模板方法(Template Method)。这是在面试、源码阅读(比如 Spring、JUnit、Servlet)中都非常常见的模式。
🧩 一、概念与定义
模板方法模式(Template Method Pattern)
是一种定义算法框架的设计模式,
它允许子类在不改变算法整体结构的情况下,重写算法的某些步骤。
简单说:父类定流程,子类定细节。
🧠 二、核心思想
模板方法模式通过:
- 在 父类 中定义算法的骨架(即模板方法);
- 将部分步骤延迟到 子类实现;
来实现算法流程的复用与可扩展。
🧱 三、结构组成
抽象类 AbstractClass
├── templateMethod() # 模板方法(定义算法流程)
├── primitiveOperation1() # 基本操作(抽象方法)
└── primitiveOperation2() # 基本操作(抽象方法)
具体类 ConcreteClass
├── 实现 primitiveOperation1()
└── 实现 primitiveOperation2()
💻 四、示例代码(Java)
抽象类:定义模板
abstract class Game {
// 模板方法
public final void play() {
initialize();
startPlay();
endPlay();
}
protected abstract void initialize();
protected abstract void startPlay();
protected abstract void endPlay();
}
具体实现类
class Football extends Game {
@Override
protected void initialize() {
System.out.println("足球游戏初始化,准备开始...");
}
@Override
protected void startPlay() {
System.out.println("足球比赛开始!");
}
@Override
protected void endPlay() {
System.out.println("足球比赛结束!");
}
}
class Basketball extends Game {
@Override
protected void initialize() {
System.out.println("篮球游戏初始化...");
}
@Override
protected void startPlay() {
System.out.println("篮球比赛开始!");
}
@Override
protected void endPlay() {
System.out.println("篮球比赛结束!");
}
}
调用
public class TemplateDemo {
public static void main(String[] args) {
Game game = new Football();
game.play(); // 执行整个流程
}
}
输出:
足球游戏初始化,准备开始...
足球比赛开始!
足球比赛结束!
🔍 五、生活类比
以“泡茶与泡咖啡”为例:
- 烧水
- 冲泡饮料(茶或咖啡)
- 倒入杯中
- 加调料(柠檬 / 牛奶)
前 1、3 步流程一样,
第 2、4 步每种饮品不同。
=> 就是典型的 模板方法。
⚙️ 六、在框架中的典型应用
| 框架/库 | 使用场景 | 模板方法 |
|---|---|---|
| Spring | AbstractApplicationContext.refresh() 定义容器启动流程,具体步骤由子类实现 | ✅ |
| JUnit | setUp()、tearDown() 执行在测试前后,测试执行流程固定 | ✅ |
| Servlet | doGet()、doPost() 在 service() 模板中被调用 | ✅ |
| MyBatis | BaseExecutor.query() 中封装查询模板,部分实现交由子类完成 | ✅ |
⚖️ 七、优缺点分析
优点:
- 复用算法结构,避免重复代码。
- 易于扩展(新增子类即可定制具体步骤)。
- 控制反转(父类控制整体流程,子类实现细节)。
缺点:
- 对于过多的抽象步骤,子类实现成本较高。
- 模板方法一旦固定,整体流程难以灵活修改。
🎯 八、适用场景
✅ 算法流程固定,部分步骤可变。
✅ 多个子类共享相同算法结构。
✅ 框架设计中:定义稳定骨架,扩展由用户定制。
🧩 九、UML 图
┌───────────────────────┐
│ AbstractClass │
│-----------------------│
│ + templateMethod() │
│ + primitiveOp1() │
│ + primitiveOp2() │
└──────────┬────────────┘
│
┌──────────────┴──────────────┐
│ │
┌─┴────────────┐ ┌─────┴───────────┐
│ConcreteClassA│ │ConcreteClassB │
│--------------│ │----------------│
│+ primitiveOp1│ │+ primitiveOp1 │
│+ primitiveOp2│ │+ primitiveOp2 │
└──────────────┘ └────────────────┘
如果你想,我可以帮你生成:
- 🧾 一份 模板方法模式的对比速查表(与策略模式、工厂方法对比)
- 或者一份 Python / C++ / JavaScript 版本实现例子。
你想要哪一种?
发表回复