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
andboilWater
不是抽象的,因为它们对于茶和咖啡都是完全相同的。
现在我们创建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 的普通方法。