自学教程 学编程从这里开始

模板方法模式

《模板方法模式》|设计模式系列第20篇

系列:行为型模式 · 模板方法模式(Template Method Pattern)
关键词:固定骨架、步骤复用、钩子方法、父类定义流程、子类实现细节

一、什么是模板方法模式

模板方法模式(Template Method Pattern):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

属于行为型设计模式。

简单理解:
父类定义整套业务流程的固定步骤(模板方法),流程顺序不可修改;变化的步骤声明为抽象方法,交给子类实现。子类只需要重写可变步骤,不能修改整体执行骨架。
例子:Beverage 饮品制作,固定流程:boil water、brew、pourInCup、addCondiments;Coffee 和 Tea 各自实现 brew 和 addCondiments。

核心意图
复用算法整体流程骨架;将可变步骤下沉到子类实现,统一流程结构。

适用场景

  1. 多个业务流程大体一致,只有部分步骤实现不同
  2. 需要控制算法执行顺序,不允许子类修改主流程
  3. 抽取公共代码到父类,减少重复代码
  4. 框架固定主流程,业务扩展自定义部分步骤

⚠️ 缺点预警:父类与子类耦合;骨架一旦变更,影响所有子类。

二、UML结构图

角色划分:

  1. AbstractClass(抽象类):包含模板方法(final,固定流程)、抽象原语方法(子类实现)、钩子方法(可选重写)
  2. ConcreteClass(具体子类):实现抽象步骤,可重写钩子方法
  3. Client(客户端):创建子类实例,调用模板方法

三、Java 完整示例

场景:Beverage 饮品制作流程,固定4步,Coffee、Tea实现差异化步骤。代码全部使用英文。

public abstract class Beverage {
    // template method, fixed algorithm skeleton
    public final void prepare() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    private void boilWater() {
        System.out.println("Boil water");
    }

    private void pourInCup() {
        System.out.println("Pour into cup");
    }

    protected abstract void brew();
    protected abstract void addCondiments();

    // hook method, optional override
    protected boolean customerWantsCondiments() {
        return true;
    }
}

public class Coffee extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Brew coffee grinds");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Add milk and sugar");
    }
}

public class Tea extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Steep tea leaves");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Add lemon");
    }

    @Override
    protected boolean customerWantsCondiments() {
        return false;
    }
}

public class Client {
    public static void main(String[] args) {
        Beverage coffee = new Coffee();
        coffee.prepare();

        System.out.println("---");

        Beverage tea = new Tea();
        tea.prepare();
    }
}

运行输出:

Boil water
Brew coffee grinds
Pour into cup
Add milk and sugar
---
Boil water
Steep tea leaves
Pour into cup

四、模板方法 vs 策略模式

模式目标核心
Template Method父类固定流程骨架,继承实现扩展基于继承,流程固定,子类实现步骤
Strategy封装可互换算法,组合替换算法基于组合,动态替换整套算法

五、优缺点总结

✅ 优点

  1. 复用公共流程代码,减少重复
  2. 父类控制主流程顺序,约束子类行为
  3. 新增业务只需要新增子类,符合开闭原则

❌ 缺点

  1. 基于继承,父类与子类耦合度高
  2. 骨架修改会影响全部子类
  3. 流程膨胀后抽象类职责较重

六、框架源码应用

  • JDK java.util.AbstractList
  • Spring JdbcTemplate 模板方法(query、update骨架)
  • Spring AbstractApplicationContext 容器刷新 refresh()
  • Servlet HttpServlet service/doGet/doPost

七、小结

模板方法核心:抽象类final模板方法固定算法骨架,可变步骤交给子类实现,支持钩子方法控制分支。
适合框架级固定流程;优先使用场景:多段业务流程大部分步骤一致,仅局部逻辑不同。

标签:

0 条笔记