前言:

  我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如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中进行重写。

  2:Mybatis框架中也有一些经典实用,比如BaseExecutor类,它是一个基础的SQL执行类,实现了大部分SQL的执行逻辑,然后把几个方法教给子类定制化完成,源码如下:

其中doUpdate(),doFlushStatements(),doQuery(),doQueryCursor()等方法都是由子类来实现的,BaseExecutor有那些子类呢?我们来看一下他的类图:

  我们可以去看看具体每个子类的不同的实现。

模板模式的优缺点:

  优点:

  1:利用模板模式可以将相同处理逻辑的代码放到抽象父类中,提高了代码的复用性。

  2:将不同的逻辑放到不同的子类中,通过子类的扩展增加新的行为,提高了代码的扩展性。

  3:把不变的行为写在父类中,去除了子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。

  4:公司的高级工程师或者架构师在项目前期可以利用模板模式定义好流程,让其他编码功工程师去实现具体。

  缺点

  1:每个抽象类都需要至少一个子类来实现,导致了类数量的增加。

  2:类数量增加间接增加了系统的复杂性。

  3:因为继承关系的自身缺点,如果父类添加一个新的抽象方法,素有子类都要实现一遍。

代码链接:https://gitee.com/ganganbobo/gps-parent

Java设计模式之模板方法模式(Template)的更多相关文章

  1. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  2. 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

    原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...

  3. 二十四种设计模式:模板方法模式(Template Method Pattern)

    模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...

  4. Java设计模式之模板方法模式(Template Method)

    一.含义 定义一个算法中的操作框架,而将一些步骤延迟到子类中.使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤,不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现. 二 ...

  5. java设计模式之模板方法模式

    模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...

  6. Java设计模式应用——模板方法模式

    所谓模板方法模式,就是在一组方法结构一致,只有部分逻辑不一样时,使用抽象类制作一个逻辑模板,具体是实现类仅仅实现特殊逻辑就行了.类似科举制度八股文,文章结构相同,仅仅具体语句有差异,我们只需要按照八股 ...

  7. [设计模式] 22 模板方法模式 template

    转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...

  8. 从西天取经的九九八十一难来看Java设计模式:模板方法模式

    目录 示例 模板方法模式 定义 意图 主要解决问题 适用场景 优缺点 西天取经的九九八十一难 示例 当我们设计一个类时,我们能明确它对外提供的某个方法的内部执行步骤, 但一些步骤,不同的子类有不同的行 ...

  9. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

随机推荐

  1. ubuntu下安装及配置git的方法

    安装Git 一个全新的ubunt系统,需要安装Git(系统是不具有该工具的),方法如下: 在terminel中输入如下命令: sudo apt-get install git git-core git ...

  2. netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk

    PoolArena实现了用于高效分配和释放内存,并尽可能减少内存碎片的内存池,这个内存管理实现使用PageRun/PoolSubpage算法.分析代码之前,先熟悉一些重要的概念: page: 页,一个 ...

  3. [Luogu3868] [TJOI2009]猜数字

    题目描述 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意 ...

  4. iOS开发请您把握现在 — 面向未来学习

    iOS开发请您把握现在 — 面向未来学习 这一篇文章,如果你是一名iOS开发正好也处于开发晋升瓶颈迷茫期,不妨停下你的脚步,花五分钟看看,兴许有你需要的!文章结尾有彩蛋 群里常见的唱哀 iOS现在到底 ...

  5. Async,Await和ConfigureAwait的关系

    [转自]https://mp.weixin.qq.com/s/h10V-FshGoaQUWFPfy-azg 在.NET Framework 4.5中,async / await关键字已添加到该版本中, ...

  6. Shell多进程执行任务

    展示代码 #!/bin/bash trap "exec 1000>&-;exec 1000<&-;exit 0" 2 # 分别为 创建管道文件,文件操作 ...

  7. Go语言系列开发之延迟调用和作用域

    Hello,各位小伙伴大家好,我是小栈君,最近一段时间我们将继续分享关于go语言基础系列,当然后期小栈君已经在筹划关于java.Python,数据分析.人工智能和大数据等相关系列文章.希望能和大家一起 ...

  8. Java8系列 (一) Lambda表达式

    函数式编程 在介绍Lambda表达式之前, 首先需要引入另一个概念, 函数式编程. 函数式编程是一种编程范式, 也就是如何编写程序的方法论.它的核心思想是将运算过程尽量写成一系列嵌套的函数调用,关注的 ...

  9. 搭建ASP.NET Core WebApi项目

    步骤 从“文件”菜单中选择“新建”>“项目” . 选择“ASP.NET Core Web 应用程序”模板,再单击“下一步” . 将项目命名为 NetCoreWebApi,然后单击“创建” . 选 ...

  10. 设计模式(十八)Memento模式

    在使用面向对象编程的方式实现撤销功能时,需要事先保存实例的相关状态信息.然后,在撤销时,还需要根据所保存的信息将实例恢复至原来的状态. 要想恢复实例,需要一个可以自由访问实例内部结构的权限.但是,如果 ...