1、模式说明java
现实世界中的模板是用于将事物的结构规律予以固定化、标准化的成果,它体现告终构形式的标准化。例如镂空文字印刷的模板,经过某个模板印刷出来的文字字体大小都是如出一辙,可是具体使用什么材质的颜料,什么颜色的颜料来印刷文字,取决于具体实际业务场景的须要。因而可知,模板制定了某些固定的条条框框,以及事物的处理标准流程,可是并无说明如何去作,具体如何作,取决于使用模板的人。mysql
在程序设计领域,模板是具备一系列抽象方法的接口类,单看接口类,咱们只能知道这个模板有哪些抽象方法以及这些方法的调用顺序,但最终这些方法具体作什么操做,仅从模板类没法得知。继承模板的不一样的子类,对这些抽象方法能够有不一样的实现,当父类的模板方法被调用时,程序就能够有不一样的行为实现。算法
像这样,在父类中定义处理流程的框架,在子类中实现具体处理的模式,称为模板方法模式。spring
在一般的面向对象程序设计中,咱们习惯于站在子类的角度思考问题:例如子类继承了父类的哪些方法和属性,子类如何扩展父类实现新的功能,子类如何覆盖父类的方法来改变程序的行为。如今换一种角度,站在父类的角度思考子类:期待子类须要实现的抽象方法,要求子类必须实现的抽象方法。这也是Java面向对象程序设计中抽象类设计的特色:抽象类并不说明具体要执行的操做,可是抽象类能够提早决定继承它的子类中的方法名(抽象类中的方法名),并定义这些方法的处理流程,这种在抽象阶段决定处理流程很是重要:sql
举个具体的例子,在程序中访问数据库,不管是什么数据库(mysql、oracle、h2),要操做它们都要作一些特定步骤的操做:数据库
Spring针对不一样的平台,提供了几种不一样的模板:设计模式
2、模板方法(Template Method)模式类图oracle
3、模板方法(Template Method)模式中的角色框架
4、代码示例maven
这里使用Spring的JDBCTemplate来演示模板方法模式:
1:建立java控制台应用程序,并添加spring相关依赖(或者使用maven建立java项目),项目目录结构以下:
注:adapterpattern包和iteratorpattern包是以前设计模式的代码示例包,无需理会(也能够查看我以前的博客,里面有说明这些代码是如何建立的)。
2:建立数据源的Bean,即上图中的ContextBeans类:
package com.designpattern.cn.templatemethodpattern; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.stereotype.Component; import javax.sql.DataSource; @Component public class ContextBeans { @Bean public DataSource dataSource(){ DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://10.211.55.100:3306/fruit_sale_system"); dataSource.setUsername("root"); dataSource.setPassword("123456"); return dataSource; } }
3:启用Spring容器的自动扫描配置类SpringConfig:
package com.designpattern.cn.templatemethodpattern; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan public class SpringConfig { }
4:测试使用模板方法操做数据库执行结果:
能够看到上述代码中,我只进行了Spring的基本配置,并为项目设置了一个mysql数据源,经过建立模板的实例JdbcTemplate,就能够直接调用queryForObject模板方法,实现业务查询。
5、相关的模式