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

(为了防止子类改变模板方法中的算法,可以将模板方法声明为final)

2、钩子(hook)是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。

3、实例:

1)需求:
  冲咖啡步骤: 把水煮沸--->用沸水冲泡咖啡--->把咖啡倒进杯子里--->加糖和牛奶
  冲茶步骤: 把水煮沸--->用沸水冲泡茶--->把茶倒进杯子里--->加柠檬片
 使用模板方法抽取公共类并实现具体动作,子类通过hook覆盖父类中需要的方法。

2)代码实现:

  a)抽象父类

  1. public abstract class CaffeineBeverageWithHook {
  2. public void prepareRecip(){
  3. boliWater();
  4. brew();
  5. pourInCup();
  6. if(customerWantCondiments()){
  7. addCondiments();
  8. }
  9. }
  10.  
  11. abstract void brew();
  12.  
  13. abstract void addCondiments();
  14.  
  15. public void boliWater(){
  16. System.out.println("Bolling water");
  17. }
  18.  
  19. public void pourInCup() {
  20. System.out.println("Pouring into Cup");
  21. }
  22.  
  23. boolean customerWantCondiments(){
  24. return true;
  25. }
  26. }

  b) 子类具体实现

  1. public class CoffeeWithHook extends CaffeineBeverageWithHook {
  2.  
  3. @Override
  4. void brew() {
  5. System.out.println("Dripping Coffee through filter");
  6. }
  7.  
  8. @Override
  9. void addCondiments() {
  10. System.out.println("Adding Suger and Milk");
  11. }
  12.  
  13. public boolean customerWantCondiments() {
  14. String answer = getUserInput();
  15. if (answer.toLowerCase().startsWith("y")) {
  16. return true;
  17. } else {
  18. return false;
  19. }
  20. }
  21.  
  22. private String getUserInput() {
  23. String answer = "no";
  24. System.out.println("Would you like some suger and milk (y/n)?: ");
  25. BufferedReader in = new BufferedReader(new InputStreamReader((System.in)));
  26. try {
  27. answer = in.readLine();
  28. } catch (IOException e) {
  29. System.out.println("IO error!");
  30. }
  31. return answer;
  32. }
  33. }
  34.  
  35. public class TeaWithHook extends CaffeineBeverageWithHook{
  36.  
  37. @Override
  38. void brew() {
  39. System.out.println("Dripping tea through filter");
  40. }
  41.  
  42. @Override
  43. void addCondiments() {
  44. System.out.println("Adding lemon");
  45. }
  46.  
  47. public boolean customerWantCondiments() {
  48. String answer = getUserInput();
  49. if (answer.toLowerCase().startsWith("y")) {
  50. return true;
  51. } else {
  52. return false;
  53. }
  54. }
  55.  
  56. private String getUserInput() {
  57. String answer = "no";
  58. System.out.println("Would you like some lemon (y/n)?: ");
  59. BufferedReader in = new BufferedReader(new InputStreamReader((System.in)));
  60. try {
  61. answer = in.readLine();
  62. } catch (IOException e) {
  63. System.out.println("IO error!");
  64. }
  65. return answer;
  66. }
  67. }

  c)测试类

  1. public class CaffineBeverageTest {
  2. public static void main(String[] args) {
  3. TeaWithHook teaHook = new TeaWithHook();
  4. CoffeeWithHook coffeeHook = new CoffeeWithHook();
  5.  
  6. System.out.println("\n============Making Tea start===========");
  7. teaHook.prepareRecip();
  8. System.out.println("\n=============Making Tea end============");
  9.  
  10. System.out.println("\n============Making Coffee start===========");
  11. coffeeHook.prepareRecip();
  12. System.out.println("\n=============Making Coffee end============");
  13. }
  14. }

  测试结果:

============Making Tea start===========
Bolling water
Dripping tea through filter
Pouring into Cup
Would you like some lemon (y/n)?:
n

=============Making Tea end============

============Making Coffee start===========
Bolling water
Dripping Coffee through filter
Pouring into Cup
Would you like some suger and milk (y/n)?:
y
Adding Suger and Milk

=============Making Coffee end============

JAVA设计模式---模板方法的更多相关文章

  1. JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

  2. Java设计模式--模板方法模式

    定义: 模板模式是一种行为设计模式,使用了JAVA的继承机制,在抽象类中定义一个模板方法,该方法引用了若干个抽象方法(由子类实现)或具体方法(子类可以覆盖重写).它的实现思路是,创建一个桩方法,并且定 ...

  3. jvm源码解读--20 结合jvm源码理解 java 设计模式 模板方法

    write by 张艳涛 前言: 在学习jvm之前,看过设计模式的书,知道模板方法的设计模式,今天在看java并发编程的艺术里面关于AbstractQueuedSynchronizer 用法,这个就使 ...

  4. java设计模式 模板方法模式Template Method

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己 ...

  5. Java设计模式—模板方法模式

    模板方法模式仅仅使用了Java的继承机制,但它是一个应用非常广泛的模式. 1.定义:           一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定义该 ...

  6. Java设计模式——模板方法设计模式(abstract修饰)

    解释: 一个抽象类中,有一个主方法,再定义 1...n 个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用. 解决的问题: 当功能内部一 ...

  7. Java设计模式-模板方法模式(Template Method)

    解释一下模板方法模式,就是指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用,先看个关系 ...

  8. Java设计模式——模板方法模式

    转载自:https://www.cnblogs.com/zplogo/p/6428593.html 用抽象基类定义算法框架 RefreshBeverage package com.pattern.te ...

  9. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

随机推荐

  1. PEP8 Python 编码规范整理

    一 代码编排1 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格.2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在操作符的后边敲回车.3 类 ...

  2. bzoj usaco 金组水题题解(2)

    续.....TAT这回不到50题编辑器就崩了.. 这里塞40道吧= = bzoj 1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害 比较经典的最小割?..然而 ...

  3. How Many Sets I(容斥定理)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3556 How Many Sets I Time Limit: 2 ...

  4. Java大数应用

    1.大数加法 import java.math.BigInteger; import java.util.Scanner; public class Main { public static void ...

  5. HDU--1213并查集

    题目传送门:HDU--1213 //题意:ignatius过生日,客人来到,他想知道他需要准备多少张桌子.然而一张桌子上面只能坐上相互熟悉的人, //其中熟悉可定义成为A与B认识,B与C认识,我们就说 ...

  6. 简单的面向对象(OO)练习

    学生设备管理系统: 每个学校都有很多班级,每个班级都有很多设备.(设备可以更新)每个设备都有购买价格,每种设备都有折旧率(如每年折旧10%) 按班级进行统计,指定的班级有多少的设数量? 按班级进行统计 ...

  7. [高并发]抢红包设计(使用redis)

    假设一个需求,在某个预告活动中准备了10w个红包,100w人在某个时间点去开抢,每人只能抢1次,如何保证性能和准确性,下面我给出我的一个设计方案,抛砖引玉 分析瓶颈 查询用户是否已参与过活动 获取一个 ...

  8. 注意SSIS中的DT_NUMERIC类型转换为字符类型(比如DT_WSTR)时,会截断小数点前的0

    我们知道SSIS中有许多数据类型,如下图所示: 但是DT_NUMERIC这个类型有个陷进要注意,我们来做个实验,随便定义一个String类型的SSIS包变量,然后打开该变量表达式窗口: 在变量表达式窗 ...

  9. ubuntu 下 apt /apt-get command not found 命令找不到

    简介:apt 命令在ubuntu下找不到.(针对云平台,等可联网的ubuntu  如果是虚拟机,请确认能否联网 (如是虚拟机且不能联网请参考其他文章,大致方向是先挂载系统镜像再安装)) (ps:一般的 ...

  10. css3中的关键帧技术分析应用

    最近在研究网页加载进度效果的时候发现可以使用css3实现这个效果. 使用css3实现完全不需要图片,相比使用loading.gif的实现来说可能更快. 使用css3实现动态加载的效果,主要会涉及到几个 ...