先看例子:
抽象类:
package com.mashup.pattern.template;
public abstract class TemplatePatternModel {
public final void prepareDrink(){
boilWater();
makeDrink();
drew();
if(needCustomer())
{
addCondiment();
}
}
private final void boilWater(){
System.out.println("boil water......");
}
private final void drew(){
System.out.println("drew............");
}
public abstract void makeDrink();
public abstract boolean needCustomer();//钩子
public abstract void addCondiment();
}
子类一:
package com.mashup.pattern.template;
public class MakeCoffee extends TemplatePatternModel{
public MakeCoffee() {
// TODO Auto-generated constructor stub
}
@Override
public void addCondiment() {
System.out.println("add milk .............");
}
@Override
public void makeDrink() {
System.out.println("make coffee.............");
}
@Override
public boolean needCustomer() {
return false;
}
}
子类二:
package com.mashup.pattern.template;
public class MakeTea extends TemplatePatternModel{
public MakeTea() {
// TODO Auto-generated constructor stub
}
@Override
public void makeDrink() {
System.out.println("make tea.............");
}
@Override
public void addCondiment() {
System.out.println("add lemon.........");
}
@Override
public boolean needCustomer() {
return true;
}
}
测试:
package com.mashup.pattern.template;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
MakeTea tea = new MakeTea();
MakeCoffee coffee = new MakeCoffee();
tea.prepareDrink();
System.out.println("...........................................");
coffee.prepareDrink();
}
}
结果:
boil water......
make tea.............
drew............
add lemon.........
...........................................
boil water......
make coffee.............
drew............
UML图:
略
说明:
抽象类中,预先定义了若干方法,包括钩子算法,具体的实现延迟到子类中去实现----就是在抽象类中定义个算法的摸板