模板方法模式--钩子的应用
2013-07-29 17:28
274 查看
定义:钩子是一种被声明在抽象类中的方法, 但是只有空的或者默认的实现。 钩子的存在,可以让子类有能力对算法的不同点进行挂钩, 要不要挂钩, 由子类自己决定。
这个又上一篇“模块方法”添加钩子概念演变而来。 我们同样采用的是咖啡和茶饮料来解释钩子其中一种的用途。
1、超类加上钩子
CaffeineBeverageWithHook.java
2、茶和咖啡子类
TeaWithHook.java
CoffeewithHook.java
主程序main
CaffeineMain.java
在本例中,我们利用钩子控制了咖啡因饮料是否执行某部分算法; 说的更明确些, 就是饮料中是否要加进某种调料。
参考:《Head First设计模式》
这个又上一篇“模块方法”添加钩子概念演变而来。 我们同样采用的是咖啡和茶饮料来解释钩子其中一种的用途。
1、超类加上钩子
CaffeineBeverageWithHook.java
public abstract class CaffeineBeverageWithHook { final void prepareRecipe() { boilWater(); brew(); pourInCup(); if (customerWantsCondiments()) { addCondiments(); } System.out.println("order end"); } abstract void brew(); abstract void addCondiments(); void boilWater() { System.out.println("Boiling water"); } void pourInCup() { System.out.println("Pouring into cup"); } boolean customerWantsCondiments() { //在这里我们定义一个方法, 通常是空的缺省实现。 这个方法只会返回true, 不做别的事情; //这就是一个钩子, 子类可以覆盖这个方法, 但不是一定要这么做 return true; } }
2、茶和咖啡子类
TeaWithHook.java
public class TeaWithHook extends CaffeineBeverageWithHook { @Override public void brew() { System.out.println("Steeping the tea"); } @Override void addCondiments() { 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 you Tea(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 "n"; return answer; } }
CoffeewithHook.java
public class CoffeeWithHook extends CaffeineBeverageWithHook { @Override void brew() { System.out.println("Dripping Coffee through filter"); } @Override 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.println("Would you like milk and sugar with you caffee(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 "n"; return answer; } }
主程序main
CaffeineMain.java
public class CaffeineMain { public static void main(String[] args) { TeaWithHook tea = new TeaWithHook(); CoffeeWithHook coffee = new CoffeeWithHook(); System.out.println("\n\nMaking tea..."); tea.prepareRecipe(); System.out.println("\n\nMaking coffee..."); coffee.prepareRecipe(); } }
在本例中,我们利用钩子控制了咖啡因饮料是否执行某部分算法; 说的更明确些, 就是饮料中是否要加进某种调料。
参考:《Head First设计模式》
相关文章推荐
- 【机房重构】模板方法模式应用—组合查询
- java模板方法模式的应用
- 设计模式在游戏中的应用--模板方法(七)
- 模板方法模式(TemplateMethod Pattern)(二):java中模板方法和钩子的使用示例
- java回调方法、钩子方法以及模板方法模式
- 浅学设计模式之模板<Template>方法模式及在android中的应用
- 【DRP】——Servlet与模板方法模式的应用
- 设计模式的应用场景(13)--模板方法模式
- Android源码学习之模板方法模式应用
- java设计模式之模板模式以及钩子方法使用
- 抽象类应用——模板方法模式
- 回调方法、模板方法模式、钩子(hook)区分
- 设计模式之禅——模板方法模式&钩子方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- 模板方法模式--介绍、应用及代码
- 模板方法模式在学生资格审查系统(升级版)中的应用和实现
- 【设计模式】回调方法、钩子方法以及模板方法模式
- 黑马程序员:ClassLoader介绍、自定义ClasLoader的应用及模板方法设计模式
- 模板方法-高级应用 hook(钩子)
- Java设计模式应用——模板方法模式