目录
上述代码 GitHub 地址:https://github.com/baicun/designPatterns
模板模式:
封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现
模板优点:
抽取公共代码模板在超类中实现,方便维护和阅读。
模板模式应用:
Android的BaseAdapter
模板模式和策略模式区别:
模板模式侧重步骤封装;
策略模式侧重功能封装;
模板实例:
类图:
示例:以喝咖啡和喝茶的步骤为例:
喝茶(烧水->冲泡茶叶->把茶水倒入杯子->加糖)
喝咖啡(烧水->冲泡咖啡粉->把咖啡倒入杯子->加牛奶)
很明显,不同的饮品有其类似的步骤,我们将这种步骤抽象成一个算法族,不同的饮品只需要实现自己独有操作,无需关心步骤
代码:
模板超类-HotDrinkTemplate.java
public abstract class HotDrinkTemplate {
//模板核心算法
public final void prepareRecipe(){
//烧水
boilWater();
//煮
brew();
//倒杯子
pourInCup();
//加调料
addCondiments();
if(wantConditionHook()){
addCondiments();
}else{
System.out.println("no addCondiments");
}
}
public boolean wantConditionHook(){
return true;
}
//final 子类不可实现
public final void boilWater(){
System.out.println("boilWater");
}
//abstract 子类必须实现
public abstract void brew();
public final void pourInCup(){
System.out.println("pourInCup");
}
public abstract void addCondiments();
}
泡茶的子类- TeaHook.java
public class TeaHook extends HotDrinkTemplate{
@Override
public void brew() {
System.out.println("brew tea");
}
@Override
public void addCondiments() {
System.out.println("addCondiments sugar");
}
@Override
public boolean wantConditionHook() {
System.out.println("Condiments,yes or no? please input(y/n):");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String result = null;
try {
result = in.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if(result.equals("n")){
return false;
}else{
return true;
}
}
}
注·wantConditionHook()方法使模板方法更加灵活,不同子类可以实现不同的操作。
测试类:
public class MainTest {
public static void main(String[] args){
//hook测试
HotDrinkTemplate teaHook = new TeaHook();
teaHook.prepareRecipe();
}
}