1,模板类

  1. package com.pattern.template;
  2.  
  3. public abstract class CaffeineBeverageWithHook {
  4.  
  5. void prepareRecipe(){
  6. boilWater();
  7. brew();
  8. pourInCup();
  9. if(customerWantsCondiments()){
  10. addCondiments();
  11. }
  12. }
  13.  
  14. abstract void brew();
  15.  
  16. abstract void addCondiments();
  17.  
  18. void boilWater(){
  19. System.out.println("Boiling water");
  20. }
  21.  
  22. void pourInCup(){
  23. System.out.println("Pouring into cup");
  24. }
  25.  
  26. boolean customerWantsCondiments(){
  27. return true;
  28. }
  29.  
  30. }

2,模板的子类实现类

  1. package com.pattern.template;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6.  
  7. public class CoffeeWithHook extends CaffeineBeverageWithHook{
  8.  
  9. /**
  10. * @see com.pattern.template.CaffeineBeverageWithHook#brew()
  11. */
  12. @Override
  13. void brew() {
  14. System.out.println("Dripping Coffee through filter");
  15. }
  16.  
  17. /**
  18. * @see com.pattern.template.CaffeineBeverageWithHook#addCondiments()
  19. */
  20. @Override
  21. void addCondiments() {
  22. System.out.println("Adding Sugar and Milk");
  23. }
  24.  
  25. public boolean customerWantsCondiments(){
  26. String answer = getUserInput();
  27.  
  28. if(answer.toLowerCase().startsWith("y")){
  29. return true;
  30. } else{
  31. return false;
  32. }
  33. }
  34.  
  35. private String getUserInput(){
  36. String answer = null;
  37. System.out.println("Would you like milk and sugar with your coffee (y/n)?");
  38.  
  39. BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  40.  
  41. try {
  42. answer = in.readLine();
  43. } catch (IOException e) {
  44. System.out.println("IO Exception!");
  45. }
  46.  
  47. if(answer == null){
  48. return "no";
  49. }
  50. return answer;
  51. }
  52.  
  53. }

3,测试类

  1. package com.pattern.template;
  2.  
  3. public class BeverageTestDrive {
  4.  
  5. public static void main(String[] args) {
  6.  
  7. CoffeeWithHook coffeeHook = new CoffeeWithHook();
  8. System.out.println("\nMaking tea...");
  9. coffeeHook.prepareRecipe();
  10. }
  11. }

4,输出结果:

Making tea...

Boiling water

Dripping Coffee through filter

Pouring into cup

Would you like milk and sugar with your coffee (y/n)?

y

Adding Sugar and Milk

Java设计模式(七) 模板模式-使用钩子的更多相关文章

  1. java设计模式之模板模式以及钩子方法使用

    1.使用背景 模板方法模式是通过把不变行为搬到超类,去除子类里面的重复代码提现它的优势,它提供了一个很好的代码复用平台.当不可变和可变的方法在子类中混合在一起的时候, 不变的方法就会在子类中多次出现, ...

  2. 图解Java设计模式之模板模式

    图解Java设计模式之模板模式 豆浆制作问题 模板方法模式基本介绍 模板方法模式原理类图 模板方法模式解决豆浆制作问题 模板方法模式的钩子方法 模板方法模式在Spring框架中的源码分析 模板方法模式 ...

  3. JAVA设计模式之模板模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...

  4. 13.java设计模式之模板模式

    基本需求: 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 通过添加不同的配料,可以制作出不同口味的豆浆 选材.浸泡和放到豆浆机打碎这几个步骤对于制作每种口味 ...

  5. Java设计模式之模板模式(Template )

    前言: 最近学习了Glide开源图片缓存框架,在学习到通过使用ModelLoader自定义数据源的时候,Glide巧妙的使用了Java的模板模式来对外暴露处理不同的Url数据源,今天来学习总结一下模板 ...

  6. Java设计模式之模板模式及使用场景

    模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框架.结构.原型.定义一个我们共同遵守的约定. 定义了模板,我们的剩余工作就是对其进行充实.丰润,完善它的不足之处. 定义模板采用抽象类 ...

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

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

  8. python设计模式之模板模式

    python设计模式之模板模式 编写优秀代码的一个要素是避免冗余.在面向对象编程中,方法和函数是我们用来避免编写冗余代码的重要工具. 现实中,我们没法始终写出100%通用的代码.许多算法都有一些(但并 ...

  9. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  10. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

随机推荐

  1. 洛谷U4807抽水机[最小生成树]

    题目背景 kkk被Farmer John和他的奶牛贝茜虐的很惨,然后她也想体验下一个Farmer的生活.但她又懒得种地,就选择养鱼. 题目描述 这些鱼都是热带鱼(废话),很娇贵(比kkk娇贵),要经常 ...

  2. c++ 基于wincrypt的DES CBC模式加解密

    des.h #pragma once #include <windows.h> #include <atlstr.h> #include <wincrypt.h> ...

  3. data:image/png;base64

    大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJ ...

  4. 1003. Emergency

    As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...

  5. php数组函数,字符串,linux命令

    1>> Linux常用命令一. 文件目录操作命令1. ls命令    命令格式:ls [选项] [目录名]    命令功能:列出目标目录中所有的子目录和文件.2. 命令格式:cd [目录名 ...

  6. &12 二叉搜索树

    #1,定义 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的 ...

  7. spring mvc4:异常处理

    前面学习过struts2的异常处理,今天来看下spring mvc4的异常处理: 一.Servlet配置文件修改 <bean id="exceptionResolver" c ...

  8. 【福吧资源网整理】老男孩-python运维6期 不加密

    老男孩-python运维6期 不加密,连夜整理出来分享给大家老男孩的python教程确实不错. 教程目录: 下载地址:http://www.fu83.cn/thread-204-1-1.html  

  9. 分布式中使用Redis实现Session共享(一)

    上一篇介绍了如何使用nginx+iis部署一个简单的分布式系统,文章结尾留下了几个问题,其中一个是"如何解决多站点下Session共享".这篇文章将会介绍如何使用Redis,下一篇 ...

  10. 翻译qmake文档 目录

    利用空闲时间把qmke的文档翻译出来,翻译水平有限,有些地方翻译的不好,请谅解, 如果您能指出来,我会很感激并在第一时候做出修改. 翻译qmake文档(一) qmake指南和概述 翻译qmake文档( ...