泡茶
冲咖啡
Define the skeleton of an algorithm in an operation, deferring some steps to lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure. 在操作中定义算法的骨架,延迟一些步骤,让子类在不改变算法结构的情况下重新定义算法的某些步骤。
“Hook”: Control subclasses extensions(“钩子”:控制子类扩展)
HttpServlet in JavaEE:service()
public abstract class Beverage {final void prepareBeverage() {boilWater();brew();pourInCup();if (wantCondiments()) {addCondiments();}}// Hock:冲泡abstract void brew();// Hock:加入调味品abstract void addCondiments();private void boilWater() {System.out.println("Begin boil water! ...... Done!");}private void pourInCup() {System.out.println("Pour in cup!");}// Hook:默认需要调味品,子类可重写boolean wantCondiments() {return true;}
}
public class CoffeeBeverage extends Beverage {@Overrideprotected void brew() {System.out.println("Brew coffee!");}@Overrideprotected void addCondiments() {System.out.println("Add milk and sugar to coffee!");}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class TeaBeverage extends Beverage {@Overrideprotected void brew() {System.out.println("Brew tea!");}@Overrideprotected void addCondiments() {System.out.println("Add lemon to tea");}@Overrideboolean wantCondiments() {BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));System.out.println("Would you like to add lemon to tea? Please Enter yes or no(default no)!");String ans = null;try {ans = bf.readLine();} catch (IOException e) {System.out.println("Error input!");}if (ans == null || "no".equalsIgnoreCase(ans)) {return false;}return "yes".equalsIgnoreCase(ans);}
}
public class TemplateDemo {public static void main(String[] args) {Beverage coffee = new CoffeeBeverage();coffee.prepareBeverage();System.out.println("\n");Beverage tea = new TeaBeverage();tea.prepareBeverage();}
}