模板方法是什么?
- 模板方法模式(Template Method Pattern)是一种行为型设计模式。相当于父类定流程,子类补细节。也就是说,父类定义好“做事的流程”(算法骨架),具体每一步怎么做由子类决定。
生活举例
- 例如你去吃“套餐”:早餐套餐 = 主食 + 饮料,但主食和饮料的内容可以换(包子+豆浆、面包+咖啡)。
- 这就像模板方法模式:套餐的流程是固定的(父类模板方法)-> 准备主食() + 准备饮料()。然而每家早餐店可以决定细节(子类具体实现),包子店:准备包子 + 豆浆,西式店:准备面包 + 咖啡
代码举例
// 抽象父类:定义流程
abstract class Breakfast {
    // 模板方法:定义算法骨架
    public final void makeBreakfast() {
        prepareMain();
        prepareDrink();
        System.out.println("早餐准备好了!\n");
    }
    // 留给子类实现的步骤
    protected abstract void prepareMain();
    protected abstract void prepareDrink();
}
// 子类1:包子豆浆店
class ChineseBreakfast extends Breakfast {
    protected void prepareMain() {
        System.out.println("准备包子");
    }
    protected void prepareDrink() {
        System.out.println("准备豆浆");
    }
}
// 子类2:西式早餐店
class WesternBreakfast extends Breakfast {
    protected void prepareMain() {
        System.out.println("准备面包");
    }
    protected void prepareDrink() {
        System.out.println("准备咖啡");
    }
}
// 测试
public class Main {
    public static void main(String[] args) {
        Breakfast chinese = new ChineseBreakfast();
        Breakfast western = new WesternBreakfast();
        chinese.makeBreakfast();
        western.makeBreakfast();
    }
}
输出结果
准备包子
准备豆浆
早餐准备好了!
准备面包
准备咖啡
早餐准备好了!
关键点
- 核心思想:父类定义算法骨架,子类实现具体步骤
- 优点:提高复用性、符合开闭原则(父类不动,子类扩展)
- 缺点:父类改抽象方法时,所有子类都要改
- 应用场景:一套流程相同,但部分步骤不同的情况
- 典型例子:Servlet 的 service()调用doGet()/doPost()
- Servlet 一般继承 HttpServlet,但父类原本的方法中仅仅是定义了doGet() 和 doPost() 方法,这些需要自定义的Servlet中进行重写实现
 
总结
- 模板方法模式就是 固定流程 + 灵活步骤。父类规定“框架怎么走”,子类决定“细节怎么做”。