模板模式类图如下:
CaffeineBeverageWithHook的实现如下:
public abstract class CaffeineBeverageWithHook{
void prepareRecipe() {
boilWater();
brew();
pourInCup();
if(customerWantsCondiments()) {
addCondiments();
}
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
System.out.println("Boiling water");
}
void pourInCup() {
System.out.println("Pouring into cup");
}
boolean customerWantsCondiments() {
return true;
}
}
使用钩子
public class CoffeeWithHook extends CaffeineBeverageWithHook{
public void brew() {
System.out.println("Driping Coffee through filter");
}
public void addCondiments() {
System.out.println("Adding Sugar and Milk");
}
public boolean customerWantsCondiments() {
String answer=getUserInput();
if(answer.toLowerCase().startsWith("y")) {
return true;
}
else {
return false;
}
}
private String getUserInput() {
String answer=null;
System.out.println("Would you like milk and sugar with your coffe(y/n)?");
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
try {
answer=in.readLine();
}catch(IOException ioe) {
System.out.println("IO error trying to read your answer");
}
if(answer==null) {
return "no";
}
return answer;
}
}
执行测试程序
public class BeveraageTestDrive{
public static void main(String[] args) {
// TeaWithHook teaHook=new TeaWithHook();
CoffeeWithHook coffeeHook=new CoffeeWithHook();
// System.out.println("\nMaking tea...");
// teaHook.prepareRecipe();
System.out.println("\nMaking coffee");
coffeeHook.prepareRecipe();
}
}