跳至正文
来两杯美式
返回

设计模式之模板方法模式:固定骨架,可变步骤

By 来两杯美式
发布于

这是 2020 年 7 月整理的设计模式专题第十一篇。模板方法模式是”骨架复用”的代表——把不变的流程写死,把可变的步骤留给子类。像做菜:流程都是”洗菜→切菜→炒菜→装盘”,但每道菜的具体步骤不同。

简单说明

模板方法模式(Template Method Pattern):定义一个算法的骨架,一次性实现算法不变的部分,并允许子类为一个或者多个步骤提供实现,实现可变的部分。

模板方法的构成

模板方法模式的构成,可以由下面几种方法组合实现:

方法类型作用示例
模板方法(主方法)定义算法骨架,控制流程makeCourse()
具体方法定义不会变动的方法makePPT()makeVideo()
钩子方法不强制子类实现,一般用于触发其它逻辑的调用other()
抽象方法由子类实现的方法price()

实现

/**
 * 描述:课程(模板类)
 */
public abstract class AbstractCourse {

    /**
     * 制作课程:定义的算法骨架,子类可以使用,不能修改
     */
    protected final void makeCourse() {
        makePPT();
        makeVideo();
        price();
        other();
    }

    final void makePPT() {
        System.out.println("制作PPT");
    }

    final void makeVideo() {
        System.out.println("制作视频");
    }

    public abstract int price();

    protected int other() {
        return 0;   // 钩子方法:默认空实现,子类可按需覆盖
    }
}

/**
 * 描述:Java 课程:只实现可变的部分
 */
public class JavaCourse extends AbstractCourse {
    @Override
    public int price() {
        return 200;
    }
}

/**
 * 描述:前端课程:实现价格 + 覆盖钩子方法加送资源
 */
public class FECourse extends AbstractCourse {
    @Override
    public int price() {
        return 100;
    }

    @Override
    protected int other() {
        System.out.println("赠送前端资料包");   // 钩子方法触发额外逻辑
        return 1;
    }
}

流程控制:调用 makeCourse() 时,固定执行”制作PPT → 制作视频 → 定价 → 钩子”,其中 price()other() 由子类决定。

为什么 makeCourse() 要加 final:模板方法定义的是整个流程骨架,不允许子类重写流程,只允许子类实现流程中的某个步骤——这是模板方法的核心约束。

钩子方法的价值

钩子方法让子类能”参与”流程,但不强制:

适用场景与优缺点

适用场景

优点

缺点

现实中的应用

场景说明
Spring JdbcTemplate固定”获取连接→执行 SQL→处理结果→关闭”,可变部分交给回调
Servlet HttpServletdoGet/doPost 由子类实现,service() 是模板方法
AbstractList / AbstractMap骨架实现,子类只需实现少数抽象方法
JUnit测试执行流程固定,setUp/tearDown 是钩子

小结


分享这篇文章:
通过邮件分享这篇文章✓ 链接已复制
查看系列全部文章
  1. 01.软件设计原则:SOLID + KISS / YAGNI / LOD 全景
  2. 02.设计模式之原型模式,及深浅拷贝
  3. 03.设计模式之工厂模式:简单工厂、工厂方法与抽象工厂
  4. 04.设计模式之建造者模式:复杂对象的组装艺术
  5. 05.设计模式之适配器模式:让不兼容的接口协同工作
  6. 06.设计模式之桥接模式:抽象与实现分离,各自独立变化
  7. 07.设计模式之装饰者模式:动态增强,比继承更有弹性
  8. 08.设计模式之代理模式:静态代理与 JDK 动态代理
  9. 09.设计模式之外观模式:统一门面,简化子系统调用
  10. 10.设计模式之享元模式:共享细粒度对象,降低内存占用
  11. 11.设计模式之策略模式:算法家族,自由切换
  12. 12.设计模式之模板方法模式:固定骨架,可变步骤
  13. 13.设计模式之观察者模式:一对多依赖,状态变更自动通知
  14. 14.设计模式之责任链模式:请求逐级传递,动态组合处理者
  15. 15.设计模式之状态模式:状态变,行为变
  16. 16.设计模式之迭代器模式:不暴露内部实现,顺序访问集合

上一篇
Docker 入门:为什么容器化是 AI 时代的必备技能
下一篇
设计模式之策略模式:算法家族,自由切换