一、模板方法模式概述

模板方法模式(Template Method Pattern)是极为常见的设计模式之一。在实际开发中,开发者可能已经在不经意间使用了该模式。此模式需要抽象类与具体子类协同工作:抽象类用于勾勒算法的轮廓和骨架,具体子类则负责填充算法中的各个逻辑步骤。不同子类的填充方式各异,但整体流程保持一致。汇总这些基本方法的方法被称为模板方法,它在抽象类中以具体方法的形式定义。

二、模式角色

模板方法模式主要涉及以下两个核心角色:

1. 抽象模板角色(Abstract Class)

  • 定义基本操作:定义一个或多个抽象操作,这些操作是顶级逻辑的组成步骤,被称为基本方法(Primitive Operations)。
  • 实现模板方法:定义并实现一个模板方法。此方法给出顶级逻辑的骨架,调用上述基本方法,而逻辑的具体实现则推迟到子类中完成。

2. 具体模板角色(Concrete Class)

  • 实现抽象方法:实现父类中定义的一个或多个抽象方法。
  • 差异化实现:不同的具体子类可以为这些抽象方法提供不同的实现,从而使顶级逻辑的具体执行过程各不相同,但整体流程受模板方法控制。

三、代码示例

为了更清晰地说明该模式,我们使用一个经典的“制作饮品”案例。假设制作咖啡和制作茶都有不变的步骤:烧水、冲泡、倒入杯中、添加调料。这些步骤构成了模板方法,而具体的冲泡方式和添加的调料则因饮品不同而异。

以下是相关代码实现:

/**
 * 抽象模板角色:定义饮品制作的骨架
 * 将制作饮品必须遵循的步骤抽象成一个顶级逻辑
 */
public abstract class AbstractBeverage {
    
    // 模板方法:定义算法骨架
    public final void makeBeverage() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    // 基本方法:具体实现由子类提供
    public abstract void brew();
    public abstract void addCondiments();

    // 具体方法:子类通用的步骤
    public void boilWater() {
        System.out.println("烧水...");
    }

    public void pourInCup() {
        System.out.println("倒入杯中...");
    }
}

/**
 * 具体模板角色:咖啡
 */
public class Coffee extends AbstractBeverage {
    @Override
    public void brew() {
        System.out.println("用沸水冲泡咖啡粉...");
    }

    @Override
    public void addCondiments() {
        System.out.println("添加糖和牛奶...");
    }
}

/**
 * 具体模板角色:茶
 */
public class Tea extends AbstractBeverage {
    @Override
    public void brew() {
        System.out.println("用沸水浸泡茶叶...");
    }

    @Override
    public void addCondiments() {
        System.out.println("添加柠檬...");
    }
}

客户端调用代码如下:

public class Client {
    public static void main(String[] args) {
        // 制作咖啡
        AbstractBeverage coffee = new Coffee();
        coffee.makeBeverage();
        
        System.out.println("-------------");
        
        // 制作茶
        AbstractBeverage tea = new Tea();
        tea.makeBeverage();
    }
}

四、总结

模板方法模式的核心在于准备一个抽象类,在其中将部分逻辑以具体方法实现,同时声明一些抽象方法迫使子类实现剩余逻辑。不同子类可以通过不同方式实现这些抽象方法,从而实现剩余逻辑的多样化。

通过这种方式,代码结构更加清晰,具有更好的扩展性和可维护性,能够适应不同场景下的需求变化。它符合“开闭原则”,即对扩展开放,对修改关闭。

说明:本文内容基于经典设计模式理论,适用于 Java 及大多数面向对象编程语言。文中术语已统一为标准译名“模板方法模式”(原稿中混用了“模版”)。示例代码已调整为通用技术案例,以便于理解与维护。