abstract class BeverageTemplate {

    // 模板方法,定义了算法的骨架
    final void makeBeverage() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    // 具体步骤由子类实现
    abstract void brew();

    abstract void addCondiments();

    // 共同的步骤,可以在父类中定义
    void boilWater() {
        System.out.println("Boiling water");
    }

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

class Coffee extends BeverageTemplate {

    // 子类实现具体步骤
    void brew() {
        System.out.println("Brewing coffee");
    }

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

class Tea extends BeverageTemplate {

    // 子类实现具体步骤
    void brew() {
        System.out.println("Steeping the tea");
    }

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

public class TemplateMethodPatternExample {

    public static void main(String[] args) {
        System.out.println("Making coffee:");
        BeverageTemplate coffee = new Coffee();
        coffee.makeBeverage();

        System.out.println("\\nMaking tea:");
        BeverageTemplate tea = new Tea();
        tea.makeBeverage();
    }
}