Template Method
模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现.
它是一个骨架,在框架的设计中多用此设计模式.
对模板方法进行挂钩:
钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现.钩子的存在,
可以让子灰有能力对算法的不同点进行挂钩.要不要挂钩,由子类自行决定.
好莱坞原则:
高层组件对低层组件的方式是"别调用我们,我们会调用你".
- public abstract class CaffeineBeverage {
- //不希望子类覆盖此方法,声明为final
- final void prepareRecipe() {
- boilWater();
- brew();
- pourInCup();
- addCondiments();
- }
- abstract void brew();
- abstract void addCondiments();
- void boilWater() {
- System.out.println("Boiling water");
- }
- void pourInCup() {
- System.out.println("Pouring into cup");
- }
- }
- public class Tea extends CaffeineBeverage {
- public void brew() {
- System.out.println("Steeping the tea");
- }
- public void addCondiments() {
- System.out.println("Adding Lemon");
- }
- }
- public class Coffee extends CaffeineBeverage {
- public void brew() {
- System.out.println("Dripping Coffee through filter");
- }
- public void addCondiments() {
- System.out.println("Adding Sugar and Milk");
- }
- }
对模板方法使用钩子:
- 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;
- }
- }
- import java.io.*;
- public class CoffeeWithHook extends CaffeineBeverageWithHook {
- public void brew() {
- System.out.println("Dripping 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.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;
- }
- } s