一,定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

二,类图:

三,通过小例子讲解:

这个模式一般用在程序的步骤比较多,而且有固定的模式,固定的步骤,而每一步的实现又有多种情况,这是我们可以使用TemplateMethod模式。这样可以保证算法骨架的正确性,又将多态运用的非常好。

这里举个人一天要做的事情吧,假如一个人一天要有起床,吃饭,做事情,睡觉四个事项。

1,首先我们看模板类:

  1. /**
  2. * 模板方法设计模式中的“模板类”
  3. * 一般情况下模板类都是一个抽象类
  4. */
  5. public abstract class PersonDay {
  6. /**
  7. * 在模板方法中编写核心算法,这个算法是不会改变的,这个算法被子类继承,可以得到复用。
  8. * 模板方法的流程一般不让子类覆盖,不希望子类去重新定义核心算法,所以模板方法通常被final修饰
  9. */
  10. public final void day(){
  11. doGetUp();
  12. doEatBreakfast();
  13. doSome();
  14. doSleep();
  15. }
  16. //将行为的具体实现延迟到子类中完成,达到不同的实现效果。
  17. public abstract void doGetUp();
  18. public abstract void doEatBreakfast();
  19. public abstract void doSome();
  20. public abstract void doSleep();
  21. }

2,我们来看学生类:

  1. public class StudentDay extends PersonDay{
  2. //学生起床
  3. public  void doGetUp(){
  4. System.out.println("学生起床了,准备上学了")
  5. }
  6. //吃早餐
  7. public void doEatBreakfast(){
  8. System.out.println("学生吃早餐:牛奶、面包");
  9. }
  10. //上学
  11. public void doSome(){
  12. System.out.println("学生上课学习");
  13. }
  14. //睡觉
  15. public void doSleep(){
  16. System.out.println("学生做完功课睡觉");
  17. }
  18. }

3,我们来看老师类:

  1. public class StudentDay extends PersonDay{
  2. //老师起床
  3. public  void doGetUp(){
  4. System.out.println("老师起床了,安顿好家人,准备到学校工作")
  5. }
  6. //吃早餐
  7. public void doEatBreakfast(){
  8. System.out.println("老师早餐:小米粥、油条");
  9. }
  10. //教学
  11. public void doSome(){
  12. System.out.println("老师上课教学");
  13. }
  14. //睡觉
  15. public void doSleep(){
  16. System.out.println("老师备完功课睡觉");
  17. }
  18. }

其它子类…………

4,看一下测试类,非常简单:

  1. public class Test {
  2. public static void main(String[] args) {
  3. //父类指向子类
  4. PersonDay d1 = new StudentDay();
  5. d1.day();
  6. PersonDay d2 = new WorkerDay();
  7. d2.day();
  8. }
  9. }
  10. </span>

分析总结:这样我们就利用模板方法完成了这个实例,我们来分析其中的特点吧:

1,将不变的核心算法行为搬移到了父类,去除了子类中的重复代码,并保证了算法的正确性,因为就在父类中写了一次。

2,具体步骤的下放,使多态体现了其中的优势,使代码的扩展性更高!

四,应用:

大家都知道在我们编写Servlet之前需要我们将之在web.xml中进行配置,这样我们才能在jsp向Servlet中传递数据,并从之获取数据,才能完成我们网页的动态显示。但是随着功能的增多,Servlet的增多,就需要我们为每个Servlet进行配置,这样有两个缺点:1,不断的进行web.xml文件配置不仅麻烦而且会使其容量越来越大,负载也会变大;2,每个servlet需要我们继承HttpServlet,这样耦合性比较高。为了解决此,我们这里可以使用模板方法进行解决。

如果根据数据库中的表进行分类的话,我们一般对表的操作可以分成增删改查,四种操作,这里我们进行上移,看模板类:

  1. /**
  2. * 模板类,以后编写的servlet类需要继承这个类,而不是httpservlet类了
  3. * @author Administrator
  4. */
  5. public abstract class CommonServlet extends HttpServlet {
  6. @Override
  7. //模板方法,定义了算法
  8. protected void service(HttpServletRequest request, HttpServletResponse response)
  9. throws ServletException, IOException {
  10. //获取执行的类型
  11. String operationType=request.getParameter("operationType");
  12. //判断
  13. if("insert" .equals(operationType)){
  14. doInsert(request,response);
  15. }else if("select".equals(operationType)){
  16. doSelect(request,response);
  17. }else if("update".equals(operationType)){
  18. doUpdate(request,response);
  19. }else{
  20. //.......................
  21. }
  22. }
  23. //抽象方法,都需要实现
  24. protected abstract void doInsert(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
  25. protected abstract void doSelect(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
  26. protected abstract void doUpdate(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
  27. }
  28. </span>

当然那些增删改查的的servlet就需要继承这个类了:

  1. public class AuthServlet extends CommonServlet {
  2. private IAuthService authService=new AuthServiceImpl();
  3. @Override
  4. protected void doInsert(HttpServletRequest request,
  5. HttpServletResponse response) throws ServletException, IOException {
  6. //根据不同的表插入方法的具体实现
  7. }
  8. @Override
  9. protected void doSelect(HttpServletRequest request,
  10. HttpServletResponse response) throws ServletException, IOException {
  11. //根据不同表查询方法的具体实现
  12. }
  13. @Override
  14. protected void doUpdate(HttpServletRequest request,
  15. HttpServletResponse response) throws ServletException, IOException {
  16. //根据表的不同,更新方法的具体实现。
  17. }
  18. }
  19. </span>

这里注意我们在jsp页面进行相关功能时,需要我们将operationType执行的类别传过来,方便我们顶层Servlet的判断。这个就是框架抽象的很小很小的一步,但是对于这个模版方法阐释的也是很好的。

java设计模式(9):模板方法模式(TemplateMethod)的更多相关文章

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

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

  2. Java设计模式应用——模板方法模式

    所谓模板方法模式,就是在一组方法结构一致,只有部分逻辑不一样时,使用抽象类制作一个逻辑模板,具体是实现类仅仅实现特殊逻辑就行了.类似科举制度八股文,文章结构相同,仅仅具体语句有差异,我们只需要按照八股 ...

  3. Java设计模式之模板方法模式(Template Method)

    一.含义 定义一个算法中的操作框架,而将一些步骤延迟到子类中.使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤,不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现. 二 ...

  4. Java设计模式之模板方法模式(Template)

    前言: 我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象“来做调整”,针对这种拥有 ...

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

    模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...

  6. 从西天取经的九九八十一难来看Java设计模式:模板方法模式

    目录 示例 模板方法模式 定义 意图 主要解决问题 适用场景 优缺点 西天取经的九九八十一难 示例 当我们设计一个类时,我们能明确它对外提供的某个方法的内部执行步骤, 但一些步骤,不同的子类有不同的行 ...

  7. 设计模式之模板方法模式 templateMethod

    代码实现 public abstract class BankTemplateMethod { //具体方法 public void takeNumber(){ System.out.println( ...

  8. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  9. 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

    原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...

  10. 图解Java设计模式之模板模式

    图解Java设计模式之模板模式 豆浆制作问题 模板方法模式基本介绍 模板方法模式原理类图 模板方法模式解决豆浆制作问题 模板方法模式的钩子方法 模板方法模式在Spring框架中的源码分析 模板方法模式 ...

随机推荐

  1. 【转-备忘】scatter函数

    1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如下: 4.基本的使用方法如下: #导入必要的模块 import numpy as np import matp ...

  2. s9 Linux 进程管理命令

    9.1 ps:查看进程 9.2-3 pstree & pgrep 9.4-6 kill & killall & pkill 9.7 top:实时显示系统中各个进程的资源占用状况 ...

  3. 解决latex数学公式渲染不正确及行内公式中文渲染乱码问题

    问题 之前数学OCR渲染数学公式用的 katex 来渲染,前端解决方案,我们的进行公式编写的时候是需要输入中文的,如: Fe_{2}O_{3} + 3 C O \stackrel{高温}{=} 2 F ...

  4. docker部署node.js

    1.dockerfile FROM node:14.16.0 RUN mkdir -p /var/log/lily/ RUN mkdir -p /opt/node # 工作目录 WORKDIR /op ...

  5. Docker学习(7) 构建镜像

    构建docker镜像 1 构建镜像的两种方式 1 通过容器构建镜像 2 通过Dockerfile构建镜像

  6. Vue中的三种Watcher

    Vue中的三种Watcher Vue可以说存在三种watcher,第一种是在定义data函数时定义数据的render watcher:第二种是computed watcher,是computed函数在 ...

  7. Go string 详解

    前言 字符串(string) 作为 go 语言的基本数据类型,在开发中必不可少,我们务必深入学习一下,做到一清二楚. 本文假设读者已经知道切片(slice)的使用,如不了解,可阅读 Go 切片 基本知 ...

  8. DeepLabV3+语义分割实战

    DeepLabV3+语义分割实战 语义分割是计算机视觉的一项重要任务,本文使用Jittor框架实现了DeepLabV3+语义分割模型. DeepLabV3+论文:https://arxiv.org/p ...

  9. Kaggle上的犬种识别(ImageNet Dogs)

    Kaggle上的犬种识别(ImageNet Dogs) Dog Breed Identification (ImageNet Dogs) on Kaggle 在本节中,将解决在Kaggle竞赛中的犬种 ...

  10. .NET平台系列18 .NET5的超强优势

    系列目录     [已更新最新开发文章,点击查看详细] 支持所有 .NET 应用程序类型 .NET5 统一版本之后将支持所有 .NET 应用程序类型:Xamarin.ASP.NET.IoT 和桌面.此 ...