Java设计模式之Template Pattern模板模式详解

 更新时间:2023年10月09日 08:33:49   作者:十维豆脑  
这篇文章主要介绍了Java设计模式之Template Pattern模板模式详解,模板模式(Template Pattern)行为型模式之一,抽象父类定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,需要的朋友可以参考下

一、定义

模板模式(Template Pattern):行为型模式之一,抽象父类定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。

二、UML类图

在这里插入图片描述

三、角色职责

抽象类/抽象模板(Abstract Class):抽象模板类,负责给出一个算法的轮廓和骨架。 它

由一个模板方法和若干个基本方法构成。这些方法的定义如下:

  • 模板方法:定义了一套算法的骨架,按某种顺序调用其包含的基本方法。
  • 基本方法:是算法骨架/流程的某些步骤进行具体实现,包含以下几种类型,
  • 抽象方法:在抽象类中声明,由具体子类实现。 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
  • 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。

具体子类/具体实现(Concrete Class):具体实现类,实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。

四、代码实现

前言:在平时工作中就经常会用到模板方法,就像我们公司的框架里使用的Excel导入功能EasyExcel,就是一个非常典型的模板方法,我们通常会顶一个抽象类并在里面规定出一些模板方法和基本方法,再由具体的实现类去进行调用或者重写,下面就用代码给大家举个栗子。

导入抽象类(抽象类 Abstract Class)

abstract class ImportAbstractClass {
    public void TemplateMethod() {
        validateColumn();
        validateField();
        bizHandle();
    }
    public void validateColumn() {
        System.out.println("校验导入Excel的列名...");
    }
    public abstract void validateField();
    public abstract void bizHandle();
}

导入订单实现类(具体子类 Concrete Class)

public class ImportOrderClass extends ImportAbstractClass {
    @Override
    public void validateField() {
        System.out.println("校验导入订单字段...");
    }
    @Override
    public void bizHandle() {
        System.out.println("订单业务处理...");
    }
}

导入商品实现类(具体子类 Concrete Class)

public class ImportProductClass extends ImportAbstractClass {
    @Override
    public void validateField() {
        System.out.println("校验导入商品字段...");
    }
    @Override
    public void bizHandle() {
        System.out.println("商品业务处理...");
    }
}

测试类

public class TemplateTest {
    public static void main(String[] args) {
        ImportAbstractClass order = new ImportOrderClass();
        order.TemplateMethod();
        ImportAbstractClass product = new ImportProductClass();
        product.TemplateMethod();
    }
}

输出结果

校验导入Excel的列名...
校验导入订单字段...
订单业务处理...
校验导入Excel的列名...
校验导入商品字段...
商品业务处理...

五、源码分析

模板模式的应用场景非常多,就比如我们常用的MyBatis中的BaseExecutor类就使用到了模板模式。

在这里插入图片描述

在主流程中,我们可以直接调用query方法,也可以通过实现抽象方法doQuery进行使用。

六、优缺点分析

优点:

  • 不变部分封装到父类实现,而把可变部分由子类继承实现,便于子类继续扩展。
  • 在父类中提取了公共的部分代码,便于代码复用。
  • 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。

缺点:

  • 对每个不同的实现都需要定义一个子类,导致类的个数增加,系统更庞大,设计更抽象。
  • 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,它提高了代码阅读的难度。

七、适用场景

  • 多个子类有共有的方法,并且逻辑基本相同。
  • 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。

八、总结

当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑模板方法模式来处理。模板模式只是在一定程度上完成了解耦的操作,当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行文搬移到单一的地方(提取公有部分,抽象成抽象方法),这样就帮助子类摆脱重复的不变行为的纠缠。

到此这篇关于Java设计模式之Template Pattern模板模式详解的文章就介绍到这了,更多相关Template Pattern模板模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatis 在typeAliases别名时报错的解决

    mybatis 在typeAliases别名时报错的解决

    这篇文章主要介绍了mybatis 在typeAliases别名时报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • response.setHeader各种用法详解

    response.setHeader各种用法详解

    本文主要介绍了response.setHeader各种用法。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • java抓取网页或文件中的邮箱号码

    java抓取网页或文件中的邮箱号码

    这篇文章主要为大家详细介绍了java如何抓取网页或文件中的邮箱号码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Java编程几个循环实例代码分享

    Java编程几个循环实例代码分享

    这篇文章主要介绍了Java编程几个循环实例代码分享,多看多练,小编觉得还是挺不错的,这里分享给大家,供需要的朋友参考。
    2017-10-10
  • 简单了解java ORM框架JOOQ

    简单了解java ORM框架JOOQ

    这篇文章主要介绍了简单了解java ORM框架JOOQ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • svn 清理失败 (cleanup 失败) 的快速解决方法

    svn 清理失败 (cleanup 失败) 的快速解决方法

    下面小编就为大家带来一篇svn 清理失败 (cleanup 失败) 的快速解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • 详解Spring Cloud Gateway 限流操作

    详解Spring Cloud Gateway 限流操作

    这篇文章主要介绍了详解Spring Cloud Gateway 限流操作,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • SpringSecurity OAtu2+JWT实现微服务版本的单点登录的示例

    SpringSecurity OAtu2+JWT实现微服务版本的单点登录的示例

    本文主要介绍了SpringSecurity OAtu2+JWT实现微服务版本的单点登录的示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Java枚举_动力节点Java学院整理

    Java枚举_动力节点Java学院整理

    enum 的全称为 enumeration, 是 JDK 5 中引入的新特性,存放在 java.lang 包中。这篇文章给大家介绍Java枚举相关知识,需要的的朋友参考下
    2017-04-04
  • SpringBoot配置项目访问路径URL的根路径方式

    SpringBoot配置项目访问路径URL的根路径方式

    这篇文章主要介绍了SpringBoot配置项目访问路径URL的根路径方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论