模版方法模式在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中惊豺,模版方法使得子類可以在不改變算法結(jié)構(gòu)的情況下讯壶,重新定義算法的某些步驟。
示例—咖啡與茶
咖啡店沖咖啡與泡茶的方法分別是:
沖咖啡:
(1). 把水煮沸
(2). 用沸水沖泡咖啡
(3). 把咖啡倒進(jìn)杯子
(4). 加糖和牛奶
泡茶
(1). 把水煮沸
(2). 用沸水浸泡茶葉
(3). 把茶倒進(jìn)杯子
(4). 加檸檬
合并重復(fù)代碼睁枕,并抽象出基類。
UML圖表示
模版方法模式-咖啡與茶
代碼演示
咖啡因飲料基類
package Template;
public abstract class CaffeineBeverage {
final void prepareRecipe (){
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()){
addCondiments();
}
}
abstract void brew();
abstract void addCondiments();
final void boilWater() {
System.out.println("Boiling water");
}
final void pourInCup() {
System.out.println("Pouring into cup");
}
/**
* 鉤子方法,子類覆蓋這個方法瓶竭,但不見得一定要這么做
* @return
*/
boolean customerWantsCondiments(){
return true;
}
}
咖啡
package Template;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Coffee extends CaffeineBeverage{
@Override
void brew() {
System.out.println("Dripping Coffee through filter");
}
@Override
void addCondiments() {
System.out.println("Adding Sugar and Milk");
}
@Override
boolean customerWantsCondiments() {
String answer = getUserInput();
if (answer.toLowerCase().startsWith("y")) {
return true;
}
else {
return false;
}
}
private String getUserInput(){
String answer = null;
System.out.print("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 e) {
System.err.println("IO error trying to read your answer");
}
if (answer == null) {
return "no";
}
return answer;
}
}
茶
package Template;
public class Tea extends CaffeineBeverage {
@Override
void brew() {
System.out.println("Steeping the tea");
}
@Override
void addCondiments() {
System.out.println("Adding Lemon");
}
}
測試代碼
package Template;
public class BeverageTestDrive {
public static void main(String[] args) {
Tea tea = new Tea();
Coffee coffee = new Coffee();
System.out.println("\nMaking tea...");
tea.prepareRecipe();
System.out.println("\nMaking coffee...");
coffee.prepareRecipe();
}
}
測試結(jié)果
Making tea...
Boiling water
Steeping the tea
Pouring into cup
Adding Lemon
Making coffee...
Boiling water
Dripping Coffee through filter
Pouring into cup
Would you like milk and sugar with your coffee (y/n)? y
Adding Sugar and Milk