Java模板方法模式定义算法框架

  

Markdown语法:

Java模板方法模式定义算法框架

定义

在一个抽象类中定义好算法执行的骨架,而将具体的算法实现留给子类去实现。这种模式可以很好地定义算法的框架,并且让子类对具体算法的实现进行插件式的扩展。

实现

我们以制作咖啡和茶为例子来说明模板方法的实现:

首先定义一个抽象类

public abstract class Beverage {
    // 用于加入调料
    final public void prepareBeverage() {

        boilWater();

        brew();

        pourInCup();

        addCondiments();

    }

    // 把水煮沸
    public void boilWater() {
        System.out.println("Boiling water");
    }

    // 把饮料倒入杯子
    public void pourInCup() {
        System.out.println("Pouring into cup");
    }

    // 泡饮料
    abstract void brew();

    // 加调料
    abstract void addCondiments();
}

这是一个抽象类,其中有许多的钩子方法。其中brew()和addCondiments()是抽象方法,需要由子类去实现。这两个方法实现的是真正的制作咖啡或茶的方法。

以下是制作咖啡的具体实现:

public class Coffee extends Beverage {

    void brew() {
        System.out.println("Dripping Coffee through filter");
    }

    void addCondiments() {
        System.out.println("Adding Sugar and Milk");
    }
}

接下来是制作茶的具体实现:

public class Tea extends Beverage {

    void brew() {
        System.out.println("Steeping the tea");
    }

    void addCondiments() {
        System.out.println("Adding Lemon");
    }
}

示例说明

  1. 咖啡

以下代码使用了咖啡对象进行调用:

public class TestDrive {
    public static void main(String[] args) {
        Coffee coffee = new Coffee();

        coffee.prepareBeverage();
    }
}

运行结果:

Boiling water
Dripping Coffee through filter
Pouring into cup
Adding Sugar and Milk

可以看到最终打印输出的结果为调用了父类的模板方法prepareBeverage()来输出制作一杯咖啡的所有步骤。

以下代码使用了茶对象进行调用:

public class TestDrive {
    public static void main(String[] args) {
        Tea tea = new Tea();

        tea.prepareBeverage();
    }
}

运行结果:

Boiling water
Steeping the tea
Pouring into cup
Adding Lemon

同样,这里通过调用父类的模板方法prepareBeverage()方法来得到制作一杯茶的所有步骤。

通过这两个示例的说明,可以看到,模板方法可以很好地实现算法的框架。同时,这种模式也可以让子类非常方便地扩展算法的实现。

相关文章