在研究模板模式之前,先看2段代码
1.
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");
}
}
2.
public class Tea {
void prepareRecipe(){
boilWater();
steepTeaBag();
pourInCup();
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 pourInCup(){
System.out.println("Pouring into cup...");
}
}
我们可以看出上面2段代码很类似,但是确不是完全一样
下面我们来看看模板方法的定义
模板方式:定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤
public abstract class CaffeeineBeverage {
final void prepareRecipe(){
boilWater();
brew();
pourInCup();
addCondiments();
}
void boilWater() {
System.out.println("boiing water...");
}
//不一样的部分做成抽象类,等待子类去实现
abstract void brew();
abstract void addCondiments();
void pourInCup(){
System.out.println("pouring into cup...");
}
}
写一个超类,公用的方法放在超类中实现,不同的方法做成抽象类,以便子类来实现
public class Coffee extends CaffeeineBeverage{
@Override
void brew() {
System.out.println("driping coffee through filter...");
}
@Override
void addCondiments() {
System.out.println("adding sugar and milk");
}
}
如果是有的方法在子类中可以实现也可以不实现的话,在超类中可以做一个钩子,模板模式也是比较简单,但在实际使用的过程中,一定要注意步骤拆分的粒度,不要拆分的太细,太细导致子类要实现的东西较多,太粗的话,又达不到效果,因此要更加实际的情况有效的拆分