1. 应用场景

模板模式就是通过抽象类来定义一个逻辑模板,逻辑框架、逻辑原型,然后将无法决定的部分抽象成抽象类交由子类来实现,一般这些抽象类的调用逻辑还是在抽象类中完成的。这么看来,模板就是定义一个框架,比如盖房子,我们定义一个模板:房子要封闭,有门,有窗等等,但是要什么样的门,什么样的窗,这些并不在模板中描述,这个交给子类来完善,比如门使用防盗门,窗使用北向的窗等等。

2. 概念

定义算法框架,并将一些步骤的实现延迟到子类。通过模板方法,子类可以重新定义算法的某些步骤,而不用改变算法的结构。

3. Class Digram

这个抽象类中包含了模板方法。这个模板方法所用到的操作的抽象版本。模板方法在实现的过程中,用到了这两个原语操作。模板方法本身和这两个操作的具体实现之间解耦了。可能有许多的具体类,每一个都实现了模板方法所需要的全部操作。这个具体类实现抽象的操作,当模板方法需要这里两个抽象方法时,会调用他们。

4. Implementation

冲咖啡和冲茶都有类似的流程,但是某些步骤会有点不一样,要求复用那些相同步骤的代码。

public abstract class CaffeineBeverageWithHook {public final void prepareRecipe() {boilWater();brew();pourInCup();if (customerWantsCondiments()) {addCondiments();}}abstract void brew();abstract void addCondiments();public void boilWater() {System.out.println("Boiling water");}public void pourInCup() {System.out.println("Pouring into cup");}public boolean customerWantsCondiments() {return true;}
}public class CoffeeWithHook extends CaffeineBeverageWithHook{@Overridevoid brew() {System.out.println("Dripping Coffee through filter");}@Overridevoid addCondiments() {System.out.println("Adding Sugar and Milk");}@Overridepublic boolean customerWantsCondiments() {String answer = getUserInput();if(answer.toLowerCase().startsWith("y"))return true;elsereturn false;}private String getUserInput(){String answer=null;System.out.println("Would you like milk and sugar with your coffee (y/n) ?");BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));try {answer=bufferedReader.readLine();} catch (IOException e) {e.printStackTrace();}if(answer==null){return "no";}return answer;}
}public class TeaWithHook extends CaffeineBeverageWithHook {public void brew() {System.out.println("Steeping the tea");}public 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() {// get the user's responseString answer = null;System.out.print("Would you like lemon with your tea (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;}
}public class BeverageTestDrive {public static void main(String[] args) {Tea tea = new Tea();Coffee coffee = new Coffee();System.out.println("\nMaking tea...");tea.prepareRecipe();System.out.println("\nMaking coffee...");coffee.prepareRecipe();TeaWithHook teaHook = new TeaWithHook();CoffeeWithHook coffeeHook = new CoffeeWithHook();System.out.println("\nMaking tea...");teaHook.prepareRecipe();System.out.println("\nMaking coffee...");coffeeHook.prepareRecipe();}
}运行结果:Making tea...
Boiling water
Steeping the tea
Pouring into cup
Adding LemonMaking coffee...
Boiling water
Dripping Coffee through filter
Pouring into cup
Adding Sugar and MilkMaking tea...
Boiling water
Steeping the tea
Pouring into cup
Would you like lemon with your tea (y/n)? y
Adding LemonMaking coffee...
Boiling water
Dripping Coffee through filter
Pouring into cup
Would you like milk and sugar with your coffee (y/n) ?
n

Java设计模式(九):模板方法设计模式相关推荐

  1. Java复习之模板方法设计模式

    这篇博客通过一个抽象类的例子来学习一下模板方法设计模式. 模板方法设计模式:定义一个操作中的算法的骨架,而将一些可变部分的实现延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算 ...

  2. java 模板函数_重温Java中的模板方法设计模式

    Java 8 lambda表达式的简洁性为经典的GoF设计模式提供了新的视角.通过利用函数式编程,我们可以通过更少的耦合获得相同的好处 - 模板方法就是一个很好的例子. 经典的GoF模板方法实现 模板 ...

  3. Java设计模式之模板方法设计模式(银行计息案例)

    不知道为什么,这几天对Java中的设计模式非常感兴趣,恰巧呢这几天公司的开发任务还不算太多,趁着有时间昨天又把模板方法模式深入学习了一下,做了一个客户在不同银行计息的小案例,感触颇深,今天给各位分享一 ...

  4. java中的模板方法设计模式

    抽象类的应用:模板方法的设计模式 抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板, 子类在抽象类的基础上进行扩展.改造,但子类总体上会保留抽象类的行为方式: 作用: 当功能内部一部分 ...

  5. Python设计模式之模板方法设计模式

    模板方法目录 模板方法--封装算法 概念 实现 模板方法UML图 实例 模板方法的有点和缺点 优点 缺点 一些问题 模板方法--封装算法 概念 模板方法通过一种称为模板方法的方式来定义程序框架或者算法 ...

  6. 分析模板方法设计模式

    首先来看看用来比较int和String分别进行1000次运算求需要的时间进行比较,代码的实现: package com.test;import java.util.Scanner; //String的 ...

  7. 行为设计模式 - 模板方法设计模式

    模板方法设计模式 模板方法是一种行为设计模式.模板方法设计模式用于创建方法存根,并将一些实现步骤推迟到子类. 目录[ 隐藏 ] 1模板方法设计模式 1.1模板方法抽象类 1.2模板方法具体类 1.3模 ...

  8. Servlet | HTTP协议、模板方法设计模式

    目录 一:HTTP协议概述 二:HTTP协议实操 三:模板方法设计模式 一:HTTP协议概述 什么是协议? 协议实际上是某些人,或者某些组织提前制定好的一套规范.一套标准. 什么是HTTP协议? HT ...

  9. 23种设计模式之 : 模板方法设计模式

    23种设计模式之 : 模板方法设计模式 每博一文案 青年,青年!无论受怎样的挫折和打击,都要咬着牙关挺住,因为你们完全有机会重建生活:只要不灰心丧气,每一次挫折就只不过是通往新境界的一块普通绊脚石,而 ...

  10. java 模板方法设计模式_Java中的模板方法设计模式

    java 模板方法设计模式 模板方法是一种行为设计模式 ,用于创建方法存根并将某些实现步骤推迟到子类. 模板方法定义了执行算法的步骤,它可以提供默认实现,该实现对于所有或某些子类可能是通用的. 让我们 ...

最新文章

  1. Swift教程之类和结构体
  2. js 为false的几种情况
  3. Oracle-分析函数之取上下行数据lag()和lead()
  4. 制作碳排放强度的空间可视化_【科研成果】吴传清、宋子逸:长江经济带农业碳排放的时空差异特征分析...
  5. pandas速查手册(中文版)
  6. c++ -- union介绍
  7. git add 命令的一个习惯用法:逐个挑选改动
  8. linux nginx 配置端口访问,Linux入门教程:ubuntu 16.04配置nginx服务器实现一个IP一个端口多个站点,ubuntunginxNginx 使用异步...
  9. rabbitmq集群部署及配置
  10. multiprocessing.queue取数据要加锁么_秒杀抢购思路以及高并发下数据安全
  11. 数据同步工具之DataX理论
  12. 华为eNSP-ISIS理论+实验配置
  13. Ubuntu调整默认输入法
  14. GnuRadio Hacking②:使用SDR嗅探北欧芯片无线键盘鼠标数据包
  15. PYTHON3 Modbus_tk
  16. 10.2 Winsock接口
  17. 最好的嵌入式开发板是哪个?
  18. 有了这8款Mac安全杀毒和流氓防护软件,让你的mac清理优化,更加安全
  19. Kali下面装goldendict词典的安装和添加词典文件
  20. 微信小程序开发之全屏显示

热门文章

  1. 感知机算法的两种表示
  2. WinForm应用只运行一次
  3. 非常好的JavaScript学习资源推荐
  4. [转载]常用正则表达式
  5. oracle 表分区[三]
  6. 71.数据模型有哪几种?特征?
  7. 机器学习中的基本数学知识
  8. CCTYPE函数系列
  9. 利用oracle执行系统命令,利用oracle存储过程执行操作系统命令(转)
  10. 将给出的整数x翻转_每日一题:1.罗马数字转整数