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

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

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

3、实例:

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

2)代码实现:

  a)抽象父类

public abstract class CaffeineBeverageWithHook {
public void prepareRecip(){
boliWater();
brew();
pourInCup();
if(customerWantCondiments()){
addCondiments();
}
} abstract void brew(); abstract void addCondiments(); public void boliWater(){
System.out.println("Bolling water");
} public void pourInCup() {
System.out.println("Pouring into Cup");
} boolean customerWantCondiments(){
return true;
}
}

  b) 子类具体实现

public class CoffeeWithHook extends CaffeineBeverageWithHook {

    @Override
void brew() {
System.out.println("Dripping Coffee through filter");
} @Override
void addCondiments() {
System.out.println("Adding Suger and Milk");
} public boolean customerWantCondiments() {
String answer = getUserInput();
if (answer.toLowerCase().startsWith("y")) {
return true;
} else {
return false;
}
} private String getUserInput() {
String answer = "no";
System.out.println("Would you like some suger and milk (y/n)?: ");
BufferedReader in = new BufferedReader(new InputStreamReader((System.in)));
try {
answer = in.readLine();
} catch (IOException e) {
System.out.println("IO error!");
}
return answer;
}
} public class TeaWithHook extends CaffeineBeverageWithHook{ @Override
void brew() {
System.out.println("Dripping tea through filter");
} @Override
void addCondiments() {
System.out.println("Adding lemon");
} public boolean customerWantCondiments() {
String answer = getUserInput();
if (answer.toLowerCase().startsWith("y")) {
return true;
} else {
return false;
}
} private String getUserInput() {
String answer = "no";
System.out.println("Would you like some lemon (y/n)?: ");
BufferedReader in = new BufferedReader(new InputStreamReader((System.in)));
try {
answer = in.readLine();
} catch (IOException e) {
System.out.println("IO error!");
}
return answer;
}
}

  c)测试类

public class CaffineBeverageTest {
public static void main(String[] args) {
TeaWithHook teaHook = new TeaWithHook();
CoffeeWithHook coffeeHook = new CoffeeWithHook(); System.out.println("\n============Making Tea start===========");
teaHook.prepareRecip();
System.out.println("\n=============Making Tea end============"); System.out.println("\n============Making Coffee start===========");
coffeeHook.prepareRecip();
System.out.println("\n=============Making Coffee end============");
}
}

  测试结果:

============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. Sass和Compass入门

    一.前言 1.Sass是什么? Sass可以简化你的Css工作流,并可以使你的Css的扩展和维护工作变的更加容易!例如,曾几时何,因为客户的需求的变更,你必须不断的通过查找和替换来更改一个像素值,或者 ...

  2. Codeforces 834E The Bakery【枚举+数位dp】

    E. Ever-Hungry Krakozyabra time limit per test:1 second memory limit per test:256 megabytes input:st ...

  3. [51nod1462]树据结构

    题面: 给一颗以1为根的树. 每个点有两个权值:vi, ti,一开始全部是零. Q次操作: 读入o, u, d o = 1 对u到根上所有点的vi += d  o = 2 对u到根上所有点的ti += ...

  4. 一篇文章让你深透理解cookie和session,附带分布式WEB系统redis共享session方案

    cookie和session有什么区别?这是一个很基础的知识点,大家可能都知道一个大概:cookie是存在客户端的,session是存储在服务端,cookie和session用来验证识别用户的登录状态 ...

  5. 如何看apache的版本号

    在服务器上输入httpd -v就可以看到 在服务器上运行apachectl -v命令即可 Server version: Apache/2.2.3 Server built: Feb 25 2012 ...

  6. FileZilla出现Failed to convert command to 8 bit charset 

    FileZilla这款FTP客户端软件,自从华哥使用以来,采用其默认的设置,一直用得很顺畅,没有出现过什么问题.但是今天碰到了一个问题.如图. 错误信息为:Failed to convert comm ...

  7. AVFrame转换到Mat,yuv420p转换到RGB源代码

    FFmpeg中AVFrame到OpenCV中Mat的两种转换方法 方法一:查表法 void AVFrame2Img(AVFrame *pFrame, cv::Mat& img) { int f ...

  8. 【开发技术】Eclipse插件Call Hierarchy简介及设置

    Call Hierarchy 主要功能是 显示一个方法的调用层次(被哪些方法调,调了哪些方法) 在MyEclipse里Help - Software updates - Find and instal ...

  9. Java Reflection 反射基础

    反射基础: package reflection; /** * Created by : Infaraway * DATE : 2017/3/2 * Time : 23:06 * Funtion : ...

  10. 03 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之web层

    Github:https://github.com/nnngu 项目源代码:https://github.com/nnngu/nguSeckill 前端交互流程设计 对于一个系统,需要产品经理.前端工 ...