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. 使用mysql悲观锁解决并发问题

    最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持 ...

  2. 成功破解邻居的Wifi密码

    // 这是一篇导入进来的旧博客,可能有时效性问题. 默认配置的路由器,8位以下密码,黑客几分钟就可以破解.以前用自己的路由器做过实验,这次真正实践成功.环境:Kali Linux工具集:aircrac ...

  3. Java与算法之(9) - 直接插入排序

    直接插入排序是最简单的排序算法,也比较符合人的思维习惯.想像一下玩扑克牌抓牌的过程.第一张抓到5,放在手里:第二张抓到3,习惯性的会把它放在5的前面:第三张抓到7,放在5的后面:第四张抓到4,那么我们 ...

  4. POJ 3673 Cow Multiplication

    Cow Multiplication Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13312   Accepted: 93 ...

  5. 51Nod 1289 大鱼吃小鱼(模拟,经典好题)

    1289 大鱼吃小鱼             题目来源:             Codility                     基准时间限制:1 秒 空间限制:131072 KB 分值: ...

  6. 查找第k小的元素(O(n)递归解法)

    今天分享一个小技巧,虽然是小技巧但是还是很有价值的,曾经是微软的面试题.题目是这样的,一个无序的数组让你找出第k小的元素,我当时看到这道题的时候也像很多人一样都是按普通的思维,先排序在去第K个,但是当 ...

  7. [bzoj3910] 火车

    一开始看错题了... 求经过的道路数量就求个lca,把路径上的点置为已经过的话,可以写一个并查集,把某个点往上连续已经过的一段点并起来. #include<cstdio> #include ...

  8. POJ 2531 暴力深搜

    Network Saboteur Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13494   Accepted: 6543 ...

  9. hdu_3003Pupu(快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3003 Pupu Time Limit: 2000/1000 MS (Java/Others)    M ...

  10. TI-RTOS 之 PWM

    TI-RTOS 之 PWM CC1310 有4个定时器,8个PWM通道,在TI-RTOS它的驱动是写好的,引用时需要包含 PWM.h头文件即可. 一般是任务主体之前,或者主函数进行初始化. Board ...