前言:

  我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如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. sudo 提示 'xxx is not in the sudoers file.This incident will be reported.的解决方法'

    在使用 Linux 的过程中,有时候需要临时获取 root 权限来执行命令时,一般通过在命令前添加 sudo 来解决. 但是第一次使用 sudo 时,有可能会得到这样一个错误提示 xxx is not ...

  2. ToShowDoc拯救不想写文档的你

    ToShowDoc拯救不想写文档的你 写注释已经够折磨开发者了,显然天天curd的我们再去写文档岂不是分分种要被逼疯. 我想每个人都有这种经历 加了一个参数文档忘了更新 参数名更改文档忘了更新 删掉一 ...

  3. Python开发【第六篇】循环语句

    while 语句 注意事项:1.要控制循环的真值表达式的值来防止死循环 ​ 2.通常用真值表达式内的循环变量来控制循环条件 ​ 3.通常在语句内部改变循环变量 ​ 4.只要是语句都可以互相嵌套 whi ...

  4. opencv::Sobel算子

    卷积应用-图像边缘提取 卷积应用-图像边缘提取 边缘是什么 – 是像素值发生跃迁的地方,是图像的显著特征之一, 在图像特征提取.对象检测.模式识别等方面都有重要的作用. 如何捕捉/提取边缘 – 对图像 ...

  5. nginx::环境搭建

    ubuntu18.04 环境 1.需要gcc 环境,如果没有gcc环境,则需要安装 apt install gcc .安装pcre依赖库 PCRE(Perl Compatible Regular Ex ...

  6. RIDE的External Resources

    External Resources(外部资源):主要指不在project管辖范围内的资源文件. 通俗来说,如果是目录的project,只要不在自己目录范围内的资源文件都算外部资源:如果是文件的pro ...

  7. Spring Cloud Alibaba 使用nacos 注册中心

    ### 背景 上一文我们讲到了如何去搭建注册中心,这一次我们讲述如何使用nacos作为注册中心 ### spring-cloud-alibaba-basis 创建基础依赖 首先我们创建一个spring ...

  8. React-Native转小程序调研报告:Taro & Alita

    一. 我们的要求 期望的要求 基于React语法,将RN项目转化为小程序项目 该小程序能同时在 微信小程序 和 支付宝小程序这两个平台运行 底线要求 底线是能转成微信小程序,因为目前来说,因为微信先发 ...

  9. Leetcode Tags(6)Math

    一.204. Count Primes Count the number of prime numbers less than a non-negative number, n. Input: 10 ...

  10. Unity常用协程功能封装

    # 1.前言unity开发过程中,经常用到一些特定的协程功能,比如延时触发.等待触发.重复操作等.unity自带Invoke以及InvokeRepeating方法,但这些方法均采用反射机制,性能消耗, ...