定义
“模板模式”定义了算法的步骤,把某些步骤的实现延迟到子类中实现。
场景:
实现咖啡和茶的冲泡方式。茶和咖啡的冲泡方式很相似
咖啡冲泡步骤:
1、把水煮沸
2、用沸水冲泡咖啡
3、把咖啡倒进杯子
4、加糖和加奶
茶冲泡步骤:
1、把水煮沸
2、用沸水浸泡茶叶
3、把茶倒进杯子
4、加柠檬
可以看出,两者的步骤都是4步,部分步骤一致,部分步骤很类似,只是具体的操作不同。
未使用设计模式
Coffee
public class Coffee {
void prepareRecipe(){
boilWater();
brewCoffeeGrinds();
pourInCup();
addSugarAndMilk();
}
public void boilWater(){
System.out.println("Boiling water");
}
public void brewCoffeeGrinds(){
System.out.println("Dripping coffee through filter");
}
public void pourInCup(){
System.out.println("Pouring into cup");
}
public void addSugarAndMilk(){
System.out.println("Adding Sugar and Milk");
}
}
public class Tea {
void prepareRecipe(){
boilWater();
steepTeaBag();
pourInfCup();
addLemon();
}
public void boilWater(){
System.out.println("Boiling water");
}
public void steepTeaBag(){
System.out.println("Steeping the tea");
}
public void addLemon(){
System.out.println("Adding Lemon");
}
public void pourInfCup(){
System.out.println("Pouring into cup");
}
}
以上代码可以发现,有一些冗余部分,例如boilWater,pourInfCup完全一致,这部分可以抽取出来。
brewCoffeeGrinds与steepTeaBag差异不大,可以起一个新的方法名称brew();
加糖与加牛奶很类似
实现
抽象类 CaffeieneBeverage实现了prepareRecipe(),该方法固定了算法的步骤。
boilWater() 与pourInCup() 因为实现完全一样,CaffeieneBeverage直接实现了,子类可以继承
public abstract class CaffeineBeverage {
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");
}
}
Tea子类继承CaffeieneBeverage,prepareRecipe(),boilWater(),pourInCup()实现了重用。
Tea子类还实现了自己独有的brew(),addCondiments()方法,可以自定义方法功能。
public class Tea extends CaffeineBeverage {
@Override
void brew() {
System.out.println("Steeping the tea");
}
@Override
void addCondiments() {
System.out.println("Adding Lemon");
}
}
Coffee 子类同样也自定义了自己的brew()与addCondiments()
public class Coffee extends CaffeineBeverage {
@Override
void brew() {
System.out.println("Dripping Coffee through filter");
}
@Override
void addCondiments() {
System.out.println("Adding Sugar and Milk");
}
}
完成功能调用,而且使用方使用的时候很简单,一个方法就直接可以使用,不用按步骤去调用四个方法。
public static void main(String[] args) {
Tea t = new Tea() ;
Coffee coffee = new Coffee() ;
t.prepareRecipe();
coffee.prepareRecipe();
}
类图

网友评论