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

二,类图:

三,通过小例子讲解:

这个模式一般用在程序的步骤比较多,而且有固定的模式,固定的步骤,而每一步的实现又有多种情况,这是我们可以使用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. SpringMVC学习笔记-REST风格请求实现

    RESTful概念及功能 RESTful的概念:RESTful是 一种资源定位及资源操作的风格,其本身既不是标准也不是协议,而是一种设计风格,可以使得软件整体层次更加分明.代码更加简洁,并且有利于实现 ...

  2. SpringBoot基础学习(一) SpringBoot概念、简单案例实现、单元测试及热部署讲解

    SpringBoot概念 Spring优缺点分析 Spring优点 Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品,无需开发重量级的 ...

  3. 浅析PriorityBlockingQueue优先级队列原理

    介绍 当你看本文时,需要具备以下知识点 二叉树.完全二叉树.二叉堆.二叉树的表示方法 如果上述内容不懂也没关系可以先看概念. PriorityBlockingQueue是一个无界的基于数组的优先级阻塞 ...

  4. docker私有仓库搭建及使用

      1.下载官方镜像 sudo docker pull registry 下载完成后,docker images可以查看到pull下来的镜像registry 2.启动registry容器,用于提供私有 ...

  5. 稀疏性如何为AI推理增加难度

    稀疏性如何为AI推理增加难度 NVIDIA Ampere架构使数学运算加倍,以加速对各种神经网络的处理. 如果曾经玩过游戏Jenga,那么将有一些AI稀疏感. 玩家将木制积木交叉成一列.然后,每个玩家 ...

  6. CVPR2020:利用图像投票增强点云中的三维目标检测(ImVoteNet)

    CVPR2020:利用图像投票增强点云中的三维目标检测(ImVoteNet) ImVoteNet: Boosting 3D Object Detection in Point Clouds With ...

  7. springboot静态资源映射规则

    一.所有/webjars/**的请求,都会去classpath:/META-INF/resources/webjars/下的目录去找资源. 二.访问/**,即访问任何资源,如果没有controller ...

  8. 『言善信』Fiddler工具 — 10、Fiddler自动响应器(AutoResponder)的应用

    目录 1.图片重定向 2.URL重定向 3.本地调试js文件 4.模拟Mock接口测试 5.综合练习 6.总结 介绍几个Fiddler自动响应器(AutoResponder)应用场景: 场景一:生产环 ...

  9. Java如何利用for循环在控制台输出正方形对角线图形

    1 /* 2 利用循环在控制台输出如下正方形对角线图形 3 * * * * * * * * * * * 4 * * * * 5 * * * * 6 * * * * 7 * * * * 8 * * * ...

  10. Netty 框架学习 —— ChannelHandler 与 ChannelPipeline

    ChannelHandler 1. Channel 生命周期 Channel 的生命周期状态如下: 状态 描述 ChannelUnregistered Channel 已经被创建,但还未注册到 Eve ...