HeadFirst 书中的示例。
您必须冲泡茶和咖啡。一般来说,它们都有相同的步骤,比如开水和倒入杯子,但它们也有一些不同的步骤,例如添加调味品——茶我们可以加柠檬,咖啡我们可以加牛奶。
所以我们创建了一个通用(模板)类CaffeineBeverage,它是抽象的:
public abstract class CaffeineBeverage {
public final void prepareRecipe() {
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");
}
请注意,pourInCup 和 boilWater 不是抽象的,因为它们对于茶和咖啡来说是完全相同的。
现在我们创建 Tea 类,它扩展了我们的一般 CaffeineBeverage 类,我们定义了添加调味品等行为:
public class Tea extends CaffeineBeverage {
@Override
public void brew() {
System.out.println("Steeping the tea");
}
@Override
public void addCondiments() {
System.out.println("Adding Lemon");
}
}
和Coffee 类,它也扩展了CaffeineBeverage 类:
public class Coffee extends CaffeineBeverage {
@Override
public void brew() {
System.out.println("Dripping Coffee through filter");
}
@Override
public void addCondiments() {
System.out.println("Adding Sugar and Milk");
}
}
我们可以为模板方法设计模式创建测试类:
public class CaffeineBeverageTest {
public static void main(String[] args){
Tea tea = new Tea();
tea.prepareRecipe();
Coffee coffee = new Coffee();
coffee.prepareRecipe();
}
}
正如所说 - 在里面创建抽象类和方法。对不同的行为使用抽象方法,对常见的行为使用带有 body 的普通方法。