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. CVE-2017-8464复现 (远程快捷方式漏洞)

    我们的攻击机IP是192.168.222.133 目标机IP是192.168.222.132 我们首先生成一个powershell msfvenom -p windows/x64/meterprete ...

  2. Javac编译时出现包不存在的报错的解决方案

    今天在学习包类调用时出现如下错误: packa包不存在,在C盘目录下应该有这个包啊 原因是在当前目录下没找到,因为packa存放在其它目录下 如何解决: 应该配置一个classpath,直接把包所在的 ...

  3. set使用实例1+lower_bound(val)(个人模版)

    set使用实例1+lower_bound(val): #include<stdio.h> #include<set> #include<iostream> #inc ...

  4. AFO

    留坑 有点绝望 状态什么的,存在么 upd at 2017/11/14还算完满地结束了OI之路了吧.

  5. BZOJ:4825: [Hnoi2017]单旋

    Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...

  6. poj 1743

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 24835   Accepted: 8377 De ...

  7. bzoj:1681 [Usaco2005 Mar]Checking an Alibi 不在场的证明

    Description A crime has been comitted: a load of grain has been taken from the barn by one of FJ's c ...

  8. 基于.netcore 开发的轻量Rpc框架

    Rpc原理详解 博客上已经有人解释的很详细了,我就不在解释了.传送门 项目简介 项目是依赖于.net core2.0版本,内部都是依靠IOC来实现的,方便做自定义扩展.底层的通信是采用socket,s ...

  9. hbase伪分布式安装(单节点安装)

    hbase伪分布式安装(单节点安装) http://hbase.apache.org/book.html#quickstart   1.    前提配置好java,环境java变量     上传jdk ...

  10. python 模块中的 __init__.py __main__.py

    python中文件夹想作为一个模块被引用,则在文件夹内必须要包含 __init__.py 文件,即使此文件为空. 如果此模块想要运行则必须要包含 __main__.py 文件.接下来说下两个文件起到的 ...