模版模式(template method pattern)(泡茶和咖啡)

 

定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

 

笔记:封装算法。

 

 

咖啡因饮料(抽象类)

package com.tj.templatemethod.barista.caffeinebeverage; public abstract class CaffeineBeverage { /** * prepare to Recipe */ public final void prepareRecipe() { boilWater(); brew(); pourInCup(); addCondiments(); } /** * brew */ abstract void brew(); /** * add Condiments */ abstract void addCondiments(); /** * boil the water */ void boilWater() { System.out.println("Boiling water"); } /** * pour into cup */ void pourInCup() { System.out.println("Pouring into cup"); } }  

 

咖啡因饮料实现类1,茶

package com.tj.templatemethod.barista.caffeinebeverage; public class Tea extends CaffeineBeverage { @Override public void brew() { System.out.println("Steeping the tea"); } @Override public void addCondiments() { System.out.println("Adding Lemon"); } }  

 

咖啡因饮料实现类2,咖啡

package com.tj.templatemethod.barista.caffeinebeverage; public class Coffee extends CaffeineBeverage { @Override void addCondiments() { // TODO Auto-generated method stub System.out.println("Adding Sugar and Milk"); } @Override void brew() { // TODO Auto-generated method stub System.out.println("Dripping Coffee through filter"); } }  

 

带钩子咖啡因饮料(抽象类)

package com.tj.templatemethod.barista.caffeineBeverageWithHook; public abstract class CaffeineBeverageWithHook { /** * prepare to Recipe */ public final void prepareRecipe() { boilWater(); brew(); pourInCup(); if (customerWantsCondiments()) { addCondiments(); } } /** * brew */ abstract void brew(); /** * add Condiments */ abstract void addCondiments(); /** * boil the water */ void boilWater() { System.out.println("Boiling water"); } /** * pour into cup */ void pourInCup() { System.out.println("Pouring into cup"); } /** * whether customer wants condiments * @return true (yes) or false (no) */ boolean customerWantsCondiments() { return true; } }  

 

带钩子咖啡因饮料实现类1,茶

package com.tj.templatemethod.barista.caffeineBeverageWithHook; import java.io.*; public class TeaWithHook extends CaffeineBeverageWithHook { @Override public void brew() { System.out.println("Steeping the tea"); } @Override public void addCondiments() { System.out.println("Adding Lemon"); } @Override public boolean customerWantsCondiments() { String answer = getUserInput(); if (answer.toLowerCase().startsWith("y")) { return true; } else { return false; } } /** * get user's choose * @return answer(String) */ private String getUserInput() { // get the user's response 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 ioe) { System.err.println("IO error trying to read your answer"); } if (answer == null) { return "no"; } return answer; } }  

 

带钩子咖啡因饮料实现类2,咖啡

package com.tj.templatemethod.barista.caffeineBeverageWithHook; import java.io.*; public class CoffeeWithHook extends CaffeineBeverageWithHook { @Override public void brew() { System.out.println("Dripping Coffee through filter"); } @Override public void addCondiments() { System.out.println("Adding Sugar and Milk"); } @Override public boolean customerWantsCondiments() { String answer = getUserInput(); if (answer.toLowerCase().startsWith("y")) { return true; } else { return false; } } /** * get user's choose * @return answer(String) */ 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 ioe) { System.err.println("IO error trying to read your answer"); } if (answer == null) { return "no"; } return answer; } }  

 

应用入口

package com.tj.templatemethod.barista; import com.tj.templatemethod.barista.caffeineBeverageWithHook.CoffeeWithHook; import com.tj.templatemethod.barista.caffeineBeverageWithHook.TeaWithHook; import com.tj.templatemethod.barista.caffeinebeverage.Coffee; import com.tj.templatemethod.barista.caffeinebeverage.Tea; 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(); TeaWithHook teaHook = new TeaWithHook(); CoffeeWithHook coffeeHook = new CoffeeWithHook(); System.out.println("/nMaking tea..."); teaHook.prepareRecipe(); System.out.println("/nMaking coffee..."); coffeeHook.prepareRecipe(); } }  

你可能感兴趣的:(算法,String,filter,user,Class,brew)