当前位置 主页 > 网站技术 > 代码类 >

    Java设计模式模板方法(Template)原理解析

    栏目:代码类 时间:2019-11-18 12:07

    这篇文章主要介绍了Java设计模式模板方法(Template)原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    前言:

      我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象“来做调整”,针对这种拥有固定算法流程,其中有固定的步凑,存在不固定的步凑的情况下就诞生了模板方法模式。

    模板方法模式(Template)定义:

      模板方法模式又叫模板模式,指的是父类定义了一个多步凑的算法骨架,其中很多步凑是在父类中实现了的,有的步凑是根据不同的子类拥有不同的实现,就把这些“不确定”的实现步凑定义为抽象方法交给子类去实现。模板模式的核心就是在使子类不改变算法结构的情况下,重新定义算法的某些步凑。属于行为型设计模式。应用很广发,比如Mybatis中的BaseExecutor;Spring中的JdbcTemplate;Spring集成Hibernate中的HibernateTemplate,Spring集成各种Mq的Template,还有MongodbTemplate等......

    模式中的角色:

      抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。

      具体类 (Concrete):实现了抽象类中抽象放,使得父类定义的算法更完整。

    代码实现:

      1:用抽象类定义流程,比如我们每天上班有个流程: 开机-->写代码(不同的程序员可能写不同的代码-->关机; 整个流程中开机和关机是相同的,只是写代码这个步凑不同,java程序员写java代码,Php程序员写Php代码; 我们先用一个抽象的父类定义这个流程:

    public abstract class Work {
    
      //定义算法步凑流程
      public void workDay(){
    
        //1:上班开机
        openComputer();
        //2:搬砖:写代码
        coding();
        //3:下班关机     closeComputer();
      }
    
      //开机
      private final void openComputer() {
        System.out.println("到达公司,开机");
      }
    
      //写代码
      protected abstract void coding();
    
      //关机
      private final void closeComputer() {
        System.out.println("下班,关机");
      }
    
    }

      2:具体实现

       Java程序员

    public class JavaProgrammer extends Work {
      
      @Override
      protected void coding() {
        System.out.println("Java程序员打开Idea,写Java代码。。。");
      }
    }

       PHP程序员

    public class PhpProgrammer extends Work {
    
      @Override
      protected void coding() {
        System.out.println("PHP程序员打开Zend Studio,写Php代码。。。");
      }
    }

      3:使用

    public class TemplateMethodDemo {
    
      public static void main(String[] args) {
        Work javaProgrammer = new JavaProgrammer();
        javaProgrammer.workDay();
        System.out.println("================");
        Work phpProgrammer = new PhpProgrammer();
        phpProgrammer.workDay();
      }
    }

      运行结果

    模板模式在源码中的体现:

    1:我们每天都在使用的HttpServlet里面的service方法,service方法里面定义了调用流程,根据客户端调用的不同方式,if else逻辑判断调用不同的方法,比如doGet,doPost,doDelete等实现restful调用,具体的doGet,doPost方法实现我们可以在我们自己定义的Servlet中进行重写。