模板方法:定义了一个算法的步骤,并允许子类为一个或者多个步骤提供实现
我们以泡茶喝咖啡为例子:
public class Coffee{
public void prepareRecipe(){
boilWater();
brewCoffeeGrinds();
pourInCup();
addSugarAndMilk();
}
public void boilWater(){
System.out.println("将水煮沸");
}
public void brewCoffeeGrinds(){
System.out.println("冲咖啡");
}
public void pourInCup(){
System.out.println("将咖啡倒进杯子里");
}
public void addSugarAndMilk(){
System.out.println("加上一些调料");
}
}
public class Tea{
public void prepareRecipe(){
boilWater();
steepTeaBug();
pourInCup();
addLemon();
}
public void boilWater(){
System.out.println("将水煮沸");
}
public void steepTeaBug(){
System.out.println("浸泡茶叶");
}
public void pourInCup(){
System.out.println("将茶倒进杯子里");
}
public void addLemon(){
System.out.println("加上柠檬");
}
}
我们可以看出来,他们俩的代码算法上其实差不多,都定义了一系列的冲泡步骤,所以代码就有重复问题了。
我们该如何提取了。
首先boidWater()和pourInCup()两者之间都是一样的,但是在冲泡喝加入调料的时候不一样,那我们就抽取出来提炼成一个父类,然后不同部分的具体实现由子类去完成:
public abstract class Beverage(){
public final void prepareRecipe(){
boidWater();
brew();
pourInCup();
addCondiments();
}
}
public abstract void brew();
public abstract void addCondiments();
public void boilWater(){
System.out.println("将水煮沸");
}
public void pourInCup(){
System.out.println("将茶倒进杯子里");
}
具体的实现由子类来完成:
public class Tea{
public void prepareRecipe(){
brew();
addCondiments();
}
public void brew(){
System.out.println("浸泡茶叶");
}
public void addCondiments(){
System.out.println("加上柠檬");
}
}