好的,阿杰,我们来系统讲解一下 行为型设计模式之一:模板方法(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. 烧水
  2. 冲泡饮料(茶或咖啡)
  3. 倒入杯中
  4. 加调料(柠檬 / 牛奶)

前 1、3 步流程一样,
第 2、4 步每种饮品不同。
=> 就是典型的 模板方法


⚙️ 六、在框架中的典型应用

框架/库使用场景模板方法
SpringAbstractApplicationContext.refresh() 定义容器启动流程,具体步骤由子类实现
JUnitsetUp()tearDown() 执行在测试前后,测试执行流程固定
ServletdoGet()doPost()service() 模板中被调用
MyBatisBaseExecutor.query() 中封装查询模板,部分实现交由子类完成

⚖️ 七、优缺点分析

优点:

  • 复用算法结构,避免重复代码。
  • 易于扩展(新增子类即可定制具体步骤)。
  • 控制反转(父类控制整体流程,子类实现细节)。

缺点:

  • 对于过多的抽象步骤,子类实现成本较高。
  • 模板方法一旦固定,整体流程难以灵活修改。

🎯 八、适用场景

✅ 算法流程固定,部分步骤可变。
✅ 多个子类共享相同算法结构。
✅ 框架设计中:定义稳定骨架,扩展由用户定制。


🧩 九、UML 图

      ┌───────────────────────┐
      │      AbstractClass    │
      │-----------------------│
      │ + templateMethod()    │
      │ + primitiveOp1()      │
      │ + primitiveOp2()      │
      └──────────┬────────────┘
                 │
  ┌──────────────┴──────────────┐
  │                             │
┌─┴────────────┐          ┌─────┴───────────┐
│ConcreteClassA│          │ConcreteClassB   │
│--------------│          │----------------│
│+ primitiveOp1│          │+ primitiveOp1  │
│+ primitiveOp2│          │+ primitiveOp2  │
└──────────────┘          └────────────────┘


如果你想,我可以帮你生成:

  • 🧾 一份 模板方法模式的对比速查表(与策略模式、工厂方法对比)
  • 或者一份 Python / C++ / JavaScript 版本实现例子。

你想要哪一种?