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

二,类图:

三,通过小例子讲解:

这个模式一般用在程序的步骤比较多,而且有固定的模式,固定的步骤,而每一步的实现又有多种情况,这是我们可以使用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. python3 贪吃蛇小游戏

    贪吃蛇 #!/usr/bin/env python import pygame,sys,time,random from pygame.locals import * # 定义颜色变量 redColo ...

  2. C语言的指针数组与指针数组

    一.指针数组与指针数组 1,指针数组 顾名思义,即一个元素全部是指针的数组,其形式与普通数组相似,形式如 *a[N]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...

  3. Linux下安装JDK 1.8你必须知道的糟心事

    来源:Atstudy网校 1.简介 在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还的一个一个的摸索尝试,而且网上大多数都是一些Or ...

  4. Navigation activity回退到fragment失败

    我有一个activity--MainActivity, 布局中设置了一个 <androidx.fragment.app.FragmentContainerView android:layout_ ...

  5. Go语言中的单例模式

    Go语言中的单例模式 在过去的几年中,Go语言的发展是惊人的,并且吸引了很多由其他语言(Python.PHP.Ruby)转向Go语言的跨语言学习者. Go语言太容易实现并发了,以至于它在很多地方被不正 ...

  6. grasshopper DataTree 树形数据以及Graft Flatten Simplify的理解

    问题的来源: 要在grasshopper里面输出 类似于二维数组的数据 但是在 grasshopper里的 C# 电池里面,无法显示 二维ArrayList里面的数据. 在 C# 电池里参考这个帖子: ...

  7. Java中Map<Key, Value>存储结构根据值排序(sort by values)

    需求:Map<key, value>中可以根据key, value 进行排序,由于 key 都是唯一的,可以很方便的进行比较操作,但是每个key 对应的value不是唯一的,有可能出现多个 ...

  8. Xilinx FPGA全局介绍

    Xilinx FPGA全局介绍 现场可编程门阵列 (FPGA) 具有诸多特性,无论是单独使用,抑或采用多样化架构,皆可作为宝贵的计算资产:许多设计人员并不熟悉 FPGA,亦不清楚如何将这类器件整合到设 ...

  9. ARM系列处理器和架构

    从一只ARM到另一只ARM! ARM处理器和架构 当前可用的处理器 ARM1 ARM2 ARM3 ARM4和5 ARM6 ARM7 ARM8 强壮有力的ARM ARM9 ARM10 ARM架构 v1  ...

  10. oracle表ddl审计

    ============= 表ddl 审计============== 1.table信息 SQL> select * from test; ID CUST_CREDIT_LIMIT TIME ...