深入理解 Java 模板模式

在软件开发中,模板模式(Template Pattern)是一种常见的设计模式,用于定义算法的框架结构,将一些特定的步骤延迟到子类中实现。该模式提供了一种有效的方式来重用代码,同时允许子类对算法的某些部分进行定制。

模板模式的基本原则

模板模式基于以下两个基本原则:

  1. 基本结构的定义:模板模式定义了一个算法的框架结构,将算法分割成一系列步骤。这些步骤可以是抽象方法,由子类实现具体的实现细节。一般来说,模板方法模式中的抽象类称为模板类,而具体实现类称为具体类。

  2. 具体实现的延迟:模板模式将一些特定的步骤延迟到子类中实现。这样,子类可以根据自己的需求来实现具体的步骤,同时又保证了算法的整体框架结构的一致性。

模板模式的实现

为了更好地理解模板模式,我们来考虑一个计算器的例子。假设我们需要实现一个计算器,可以进行加法、减法和乘法运算。我们可以使用模板模式来定义计算器的框架结构,然后在子类中实现具体的运算逻辑。

首先,我们创建一个抽象类 Calculator,其中包含了计算器的基本算法框架:

public abstract class Calculator {

    // 模板方法,定义了算法的框架结构
    public final int calculate(int num1, int num2) {
        int result = 0;
        // 执行步骤1
        result = step1(num1, num2);
        // 执行步骤2
        result = step2(result);
        // 执行步骤3
        result = step3(result);
        return result;
    }

    // 抽象方法,由子类实现具体的步骤1
    protected abstract int step1(int num1, int num2);

    // 抽象方法,由子类实现具体的步骤2
    protected abstract int step2(int num);

    // 抽象方法,由子类实现具体的步骤3
    protected abstract int step3(int num);
}

Calculator 类中,我们定义了一个模板方法 calculate,用于执行计算的整个过程。该方法调用了三个抽象方法 step1step2step3,这些方法由子类来实现具体的运算逻辑。这样,我们就将算法的框架结构和具体的实现细节进行了分离。

接下来,我们创建具体的子类,分别实现加法、减法和乘法运算:

public class AddCalculator extends Calculator {

    @Override
    protected int step1(int num1, int num2) {
        return num1 + num2;
    }

    @Override
    protected int step2(int num) {
        return num;
    }

    @Override
    protected int step3(int num) {
        return num;
    }
}

public class SubtractCalculator extends Calculator {

    @Override
    protected int step1(int num1, int num2) {
        return num1 - num2;
    }

    @Override
    protected int step2(int num) {
        return num;
    }

    @Override
    protected int step3(int num) {
        return num;
    }
}

public class MultiplyCalculator extends Calculator {

    @Override
    protected int step1(int num1, int num2) {
        return num1 * num2;
    }

    @Override
    protected int step2(int num) {
        return num;
    }

    @Override
    protected int step3(int num) {
        return num;
    }
}

在子类中,我们分别实现了 step1step2step3 方法,具体实现了加法、减法和乘法的逻辑。这些子类都继承自 Calculator 类,因此可以直接使用父类的模板方法 `