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

二,类图:

三,通过小例子讲解:

这个模式一般用在程序的步骤比较多,而且有固定的模式,固定的步骤,而每一步的实现又有多种情况,这是我们可以使用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. Linux中级之keepalived配置

    hacmp: ibm的高可用集群软件,并且是商业的(收费),一般用于非x86架构机器当中 AIX,Unix 去IOE:ibm,oracle,emckeepalived: 一款高可用集群软件,利用vrr ...

  2. scrapy奇技淫巧1

    Request传递值到callback回调函数 def parse(self, response): request = scrapy.Request('http://www.example.com/ ...

  3. Netty 框架学习 —— Netty 组件与设计

    Channel.EventLoop 和 ChannelFuture 这一节将对 Channel.EventLoop 和 ChannelFuture 类进行讨论,它们组合在一起,可以被认为是 Netty ...

  4. Django(50)drf异常模块源码分析

    异常模块源码入口 APIView类中dispatch方法中的:response = self.handle_exception(exc) 源码分析 我们点击handle_exception跳转,查看该 ...

  5. AMD Ryzen 5000‘Cezanne’APU

    AMD Ryzen 5000'Cezanne'APU Spotted,Zen 3&7nm Vega芯片将在2021年前保留AM4支持 AMD Ryzen 5000 'Cezanne' APU ...

  6. Class.forName()、Class.forName().newInstance() 、New 三者区别!

    终于明白为什么加载数据库驱动只用Class.forName()了!!困扰了我2个小时!!希望我写的这个东西对各位有所帮助.      在Java开发特别是数据库开发中,经常会用到Class.forNa ...

  7. Markdown个人常用语法

    Markdown实用格式 标题 # 标题一级 ## 标题二级 ### 标题三级 #### 标题四级 ##### 标题五级 ###### 标题六级 粗体.斜体和删除线 **加粗字体** *斜体字体* * ...

  8. Padavan安装使用ZeroTier实现组建虚拟局域网的方法

    首先到这个网站ZeroTier – Global Area Networking注册登陆,注册及创建网络的过程可以参考网上及其他UP主的教程,我就不重复了. 本篇主要讲述的是hiboy大佬编译的固件在 ...

  9. 一、安装Tomcat服务器

    [root@ web1 ~]# yum -y install java-1.8.0-openjdk   #安装jdk [root@web1 ~]# yum -y install java-1.8.0- ...

  10. 【NX二次开发】Block UI 表达式

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...