模板方法模式(Template Method Pattern)是一种行为设计模式,定义了一个操作中的算法骨架,将一些步骤的实现延迟到子类中。通过这种方式,模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。

模式结构

  • 抽象类
    定义一个或多个抽象方法,由子类实现。
    提供一个模板方法(通常是 final 修饰,防止子类修改),实现算法的固定逻辑步骤。
  • 具体子类
    实现抽象类中定义的抽象方法。
    根据需要覆写钩子方法来扩展功能。

代码示例

// 抽象类
abstract class Beverage {
    // 模板方法
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    // 具体方法
    private void boilWater() {
        System.out.println("Boiling water...");
    }

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

    // 抽象方法
    protected abstract void brew();
    protected abstract void addCondiments();
}

// 子类:制作茶
class Tea extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Steeping the tea...");
    }

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

// 子类:制作咖啡
class Coffee extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Dripping coffee through filter...");
    }

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

// 测试代码
public class TemplateMethodDemo {
    public static void main(String[] args) {
        Beverage tea = new Tea();
        tea.prepareRecipe();

        System.out.println();

        Beverage coffee = new Coffee();
        coffee.prepareRecipe();
    }
}

优缺点

  • 优点
    代码复用:通用逻辑被抽取到抽象类中,减少代码重复。
    易于扩展:新增子类时无需修改现有代码。
    提高灵活性:允许子类实现特定步骤。
  • 缺点
    子类过多可能导致系统复杂度增加。
    父类和子类的耦合度较高,子类行为依赖父类。

适用场景

需要在多个子类中共享通用算法逻辑。
需要对算法的某些步骤进行个性化定制。
希望控制子类的扩展行为,避免修改整体算法框架。