head first---------模板方法模式
        浅谈谈模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
      模板方法模式中涉及的一个设计原则是:别找我,我会找你。模板方法模式为我们提供了一种代码复用的重用技巧。
    以下为代码的实现:
   package com.clark.templatepattern.abstractclass;
/**
 * 包含hook(钩子)的制作饮料的抽象类
 * @author Administrator
 * 
 */
public abstract class BeverageWithHook {
//相当于模板方法templateMethod()---用于封装一个算法的骨架
public final void prepareRecipe(){
boilWater();
brew();
pourInCup();
if(customerWantsCondiments()){
addCondiments();
}
}
//第一步:煮沸水
public void boilWater(){
System.out.println("Boiling Water...");
}
//第二步:把沸水冲泡咖啡或者茶
public abstract void brew();
//第三步:将饮料倒进杯子
public void pourInCup(){
System.out.println("Pouring water into cup");
}
//第四步:往饮料内加入适当的调料
public abstract void addCondiments();
//钩子方法,一种用于声明在抽象类中的方法,但是只有空的或者默认的实现
public boolean customerWantsCondiments(){
return true;
}
}


package com.clark.templatepattern;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import com.clark.templatepattern.abstractclass.BeverageWithHook;
/**
 * 制作咖啡的饮料类
 * @author Administrator
 *
 */
public class CoffeeWithHook extends BeverageWithHook {

@Override
public void brew() {
System.out.println("Dripping Coffee through filter");
}
@Override
public void addCondiments() {
System.out.println("Adding Sugar and Milk");
}
public boolean customerWantsCondiments(){
if("y".toLowerCase().equals(getUserInput())){
return true;
}else{
return false;
}
}
private String getUserInput(){
String answer=null;

System.out.println("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 e) {
e.printStackTrace();
}
if(answer==null){
return "no";
}
return answer;
}

}


package com.clark.templatepattern;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import com.clark.templatepattern.abstractclass.BeverageWithHook;
/**
 * 制作茶的饮料类
 * @author Administrator
 *
 */
public class TeaWithHook extends BeverageWithHook {

@Override
public void brew() {
System.out.println("Dripping Tea through filter");
}
@Override
public void addCondiments() {
System.out.println("Adding Lemon");
}
public boolean customerWantsCondiments(){
if("y".toLowerCase().equals(getUserInput())){
return true;
}else{
return false;
}
}
private String getUserInput(){
String answer=null;

System.out.println("Would you like Lemon with your tea(y/n)?");
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
try {
answer=in.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if(answer==null){
return "no";
}
return answer;
}

}


package com.clark.templatepattern;

public class BeverageWithHookTest {
public static void main(String[] args) {
TeaWithHook teaHook=new TeaWithHook();//创建一杯茶
CoffeeWithHook coffeeHook=new CoffeeWithHook();//创建一杯咖啡
System.out.println("\nMaking tea............");
teaHook.prepareRecipe();
System.out.println("\nMaking coffee.............");
coffeeHook.prepareRecipe();
}

最新文章

  1. 嵌入式C语言代码的调试技巧
  2. MySQL Database on Azure
  3. 【python升级录】--列表,元组
  4. bzoj 1415 期望+记忆化搜索 ****
  5. ZZC语言代码风格
  6. 3242: [Noi2013]快餐店 - BZOJ
  7. FFT初步学习小结
  8. WCF 双工模式
  9. cisco上的RIP V2加上MD5认证配置测试成功
  10. Spring MVC 用post方式提交表单到Controller乱码问题,而get方式提交没有乱码问题
  11. 字符编辑技术C语言实现
  12. Scrapy Crawl 运行出错 AttributeError: 'xxxSpider' object has no attribute '_rules' 的问题解决
  13. sqlserver 备份 与 还原
  14. maven 打jar 被引用后 出现 cannot resolve symbol 错误 生成jar包形式代码文件组织格式 非springboot文件组织格式
  15. [iOS]圆形进度条及计时功能
  16. 利用Chrome浏览器的开发者工具截取整个页面
  17. Js_获取当前日期时间
  18. SpringMVC由浅入深day01_9商品修改功能开发
  19. java study1
  20. docker-compose.yml样例(mysql主从+mycat读写分离)

热门文章

  1. CreateMutex
  2. 第4章2节《MonkeyRunner源码剖析》ADB协议及服务: ADB服务SERVICES.TXT翻译参考(原创)
  3. Ajax跨域原理及JQuery中的实现
  4. 快速构建Windows 8风格应用18-基础控件I
  5. 多数据库下activiti的流程定义缓存问题
  6. IOS开发苹果官方Sample Code及下载地址
  7. Web前端框架与类库
  8. SQLCMD的介绍
  9. CodeSmith开发系列资料总结
  10. MVC视图中的@Html.xxx(...)