豆浆制作问题

1)制作豆浆的流程 选材 – 》添加配料 --》浸泡 --》放到豆浆机打碎
2)通过添加不同的配料,可以制作出不同口味的豆浆
3)选材、浸泡和放到豆浆机打碎这几个步骤对于每种口味的豆浆都是一样的
4)模版方法模式比较简单,很容易就想到这个方案,因此就直接使用。

模板方法模式基本介绍

1)模板方法模式(Template Method Pattern),又叫做模板模式(Template Pattern),在一个抽象类定义类执行它的方法的模版。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
2)简单来说,模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
3)这种类型的设计模式属于行为型模式。

模板方法模式原理类图


原理类图的说明 :
1)AbstractClass抽象类,类中实现类模版方法(template),定义类算法的骨架,具体子类需要去实现,其它的抽象方法operationr2,3,4。
2)ConcreteClass实现抽象方法 operationr2,3,4,以完成算法中特点子类的步骤。

模板方法模式解决豆浆制作问题

1)应用实例要求
编写制作豆浆的程序,说明如下 :
制作豆浆的流程 选材 --》添加配料 --》浸泡 --》放到豆浆机打碎
通过添加不同的配料,可以制作出不同口味的豆浆
选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆、花生豆浆。。)
2)类图

  1. package com.example.demo.template;
  2. /**
  3. * 抽象类,表示豆浆
  4. * @author zhaozhaohai
  5. *
  6. */
  7. public abstract class SoyaMilk {
  8. /**
  9. * 模版方法,make,模版方法可以做成final,不让子类去覆盖。
  10. */
  11. final void make() {
  12. select();
  13. addCondiments();
  14. soak();
  15. beat();
  16. }
  17. /**
  18. * 选材料
  19. */
  20. void select() {
  21. System.out.println("第一步 :选择好的新鲜黄豆 ");
  22. }
  23. /**
  24. * 添加不同的配料,抽象方法,子类具体实现
  25. */
  26. abstract void addCondiments();
  27. /**
  28. * 浸泡
  29. */
  30. void soak() {
  31. System.out.println("第三步 :黄豆和配料开始浸泡,需要3小时 ");
  32. }
  33. void beat() {
  34. System.out.println("第四步 :黄豆和配料放到豆浆机去打碎 ");
  35. }
  36. }
  37. package com.example.demo.template;
  38. public class RedBeanSoyaMilk extends SoyaMilk{
  39. @Override
  40. void addCondiments() {
  41. // TODO Auto-generated method stub
  42. System.out.println(" 加入上好的红豆 ");
  43. }
  44. }
  45. package com.example.demo.template;
  46. public class PeanutSoyaMilk extends SoyaMilk{
  47. @Override
  48. void addCondiments() {
  49. // TODO Auto-generated method stub
  50. System.out.println(" 加入上好的花生 ");
  51. }
  52. }
  53. package com.example.demo.template;
  54. public class Client {
  55. public static void main(String[] args) {
  56. // 制作红豆豆浆
  57. System.out.println("-- 制作红豆豆浆 --");
  58. SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
  59. redBeanSoyaMilk.make();
  60. System.out.println("-- 制作花生豆浆 --");
  61. SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
  62. peanutSoyaMilk.make();
  63. }
  64. }

模板方法模式的钩子方法

1)在模板方法模式的父类中,定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。
2)还是用上面做豆浆的例子来讲解,比如,制作纯豆浆,不添加任何的配料,使用钩子方法对前面的模版方法进行改造。

  1. package com.example.demo.template;
  2. /**
  3. * 抽象类,表示豆浆
  4. * @author zhaozhaohai
  5. *
  6. */
  7. public abstract class SoyaMilk {
  8. /**
  9. * 模版方法,make,模版方法可以做成final,不让子类去覆盖。
  10. */
  11. final void make() {
  12. select();
  13. if (customerWantCondiments()) {
  14. addCondiments();
  15. }
  16. soak();
  17. beat();
  18. }
  19. /**
  20. * 选材料
  21. */
  22. void select() {
  23. System.out.println("第一步 :选择好的新鲜黄豆 ");
  24. }
  25. /**
  26. * 添加不同的配料,抽象方法,子类具体实现
  27. */
  28. abstract void addCondiments();
  29. /**
  30. * 浸泡
  31. */
  32. void soak() {
  33. System.out.println("第三步 :黄豆和配料开始浸泡,需要3小时 ");
  34. }
  35. void beat() {
  36. System.out.println("第四步 :黄豆和配料放到豆浆机去打碎 ");
  37. }
  38. /**
  39. * 钩子方法,决定是否需要添加配料
  40. * @return
  41. */
  42. boolean customerWantCondiments() {
  43. return true;
  44. }
  45. }
  46. package com.example.demo.template;
  47. public class PureSoyaMilk extends SoyaMilk{
  48. @Override
  49. void addCondiments() {
  50. // TODO Auto-generated method stub
  51. // 空实现
  52. }
  53. @Override
  54. boolean customerWantCondiments() {
  55. // TODO Auto-generated method stub
  56. return false;
  57. }
  58. }

模板方法模式在Spring框架中的源码分析






下面这两个是钩子方法,默认空实现,让子类去实现。


下面是子类实现的方法

模板方法模式的注意事项和细节

    1. 基本思想是 :算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
    2. 实现类最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
    3. 既统一了算法,也提供类很大的灵活性。父类的模板方法确保类算法的结构保持不变,同时由子类提供部分步骤的实现。
    4. 该模式的不足之处 :每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
    5. 一般模板方法都加final关键字,防止子类重写模板方法。
    6. 模板方法模式使用场景 :当要完成在某个过程,该过程要执行一系列步骤,这一系列的步骤基本相同,但其个别步骤在实现时可能不同,通车考虑用模板方法模式来处理

图解Java设计模式之模板模式的更多相关文章

  1. JAVA设计模式之模板模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...

  2. Java设计模式之模板模式(Template )

    前言: 最近学习了Glide开源图片缓存框架,在学习到通过使用ModelLoader自定义数据源的时候,Glide巧妙的使用了Java的模板模式来对外暴露处理不同的Url数据源,今天来学习总结一下模板 ...

  3. 13.java设计模式之模板模式

    基本需求: 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 通过添加不同的配料,可以制作出不同口味的豆浆 选材.浸泡和放到豆浆机打碎这几个步骤对于制作每种口味 ...

  4. java设计模式之模板模式以及钩子方法使用

    1.使用背景 模板方法模式是通过把不变行为搬到超类,去除子类里面的重复代码提现它的优势,它提供了一个很好的代码复用平台.当不可变和可变的方法在子类中混合在一起的时候, 不变的方法就会在子类中多次出现, ...

  5. Java设计模式之模板模式及使用场景

    模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框架.结构.原型.定义一个我们共同遵守的约定. 定义了模板,我们的剩余工作就是对其进行充实.丰润,完善它的不足之处. 定义模板采用抽象类 ...

  6. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  7. 图解Java设计模式之设计模式面试题

    图解Java设计模式之设计模式面试题 1.1 Java设计模式内容介绍 1.1.1 先看几个经典的面试题 1.1.2 设计模式的重要性 1.1 Java设计模式内容介绍 1.1.1 先看几个经典的面试 ...

  8. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  9. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

随机推荐

  1. (三)mybatis级联的实现

    mybatis级联的实现 开篇         级联有三种对应关系: 1.一对一(association):如学号与学生  2.一对多(collection):如角色与用户  3.多对多(discri ...

  2. 851. spfa求最短路

    给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible. 数据保证不存在负权回路. 输入格式 ...

  3. 【转载】python3安装scrapy之windows32位爬坑

    python3安装scrapy之windows32位爬坑 原创 2016年11月06日 01:38:08 标签: scrapy / windows / python / 开源框架 / 网络爬虫   早 ...

  4. Python【map、reduce、filter】内置函数使用说明

    题记 介绍下Python 中 map,reduce,和filter 内置函数的方法 一:map map(...) map(function, sequence[, sequence, ...]) -& ...

  5. Unique Snowflakes(窗口滑动)

    题目: Emily the entrepreneur has a cool business idea: packaging and selling snowflakes. She has devis ...

  6. C#利用反射调用PB编译的COM组件

    问题: 1.根据COM组件的ProgID,得到COM组件公开的类型 2.创建COM组件提供的类型的对象 3.调用执行方法 正确姿势 C#利用反射调用(后期绑定)PB编译的COM组件 C#调用COM组件 ...

  7. nginx图片过滤处理模块http_image_filter_module安装配置

    http_image_filter_module是nginx提供的集成图片处理模块,支持nginx-0.7.54以后的版本,在网站访问量不是很高磁盘有限不想生成多余的图片文件的前提下可,就可以用它实时 ...

  8. 使用BIND搭建内部DNS服务

    ​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌ ...

  9. Picaso完美兼容OkHttp3.3,缓存优化两不误 - Tamic Developer"s Blog

    为何在Fresco,Glide这么强大的背景下,我又想起了当初的Picasso,又为何写这篇文章?是因为最近项目采用了square公司的RxAndroid,Retrfit和OKhttp, 不得不联想到 ...

  10. Oracle的LOB(CLOB)大字段以及(SYS_LOB***$$)清理

    文章结构如下: 1.背景: 生产上查询那些大表然后进行清理,然而发现有SYS_LOB0000093441C00002$$这中表段占用30G(只保留一个月,如果保留更久会更大). 2.LOB介绍 Ora ...