模板方法模式:在一个方法中定义一个算法的骨架,而将一个步骤延迟到子类中。模板方法可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤。
代码实现:
(1)创建一个CaffineBeverage抽象类,并声明两个抽象方法供子类实现。
public abstract class CaffineBeverage {
final 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;
}
}
(2)继承CaffineBeverage,并实现相应的抽象方法
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class CoffeeWithHook extends CaffineBeverage {
@Override
void brew() {
// TODO Auto-generated method stub
System.out.println("Driping coffee through filter");
}
@Override
void addCondiments() {
// TODO Auto-generated method stub
System.out.println("adding condiments");
}
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 coffee (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 TeaWithHook extends CaffineBeverage {
@Override
void brew() {
// TODO Auto-generated method stub
System.out.println("Steeping the tea");
}
@Override
void addCondiments() {
// TODO Auto-generated method stub
System.out.println("Adding lemon");
}
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 lemon with your tea (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;
}
}
(4)测试代码
public class BeverageTestDrive {
public static void main(String args[]){
TeaWithHook teaHook = new TeaWithHook();
CoffeeWithHook coffeeHook = new CoffeeWithHook();
System.out.println("Making coffee");
teaHook.prepareRecipe();
System.out.println("Making coffee");
coffeeHook.prepareRecipe();
}
}