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模板模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中避免空指针的几种方法解析

    Java中避免空指针的几种方法解析

    这篇文章主要介绍了Java中避免空指针的几种方法解析,Java 中任何对象都有可能为空,当我们调用空对象的方法时就会抛出 NullPointerException 空指针异常,这是一种非常常见的错误类型,需要的朋友可以参考下
    2023-12-12
  • 三种Spring BeanName生成器,你了解吗

    三种Spring BeanName生成器,你了解吗

    无论我们是通过 XML 文件,还是 Java 代码,亦或是包扫描的方式去注册 Bean,都可以不设置BeanName,而Spring均会为之提供默认的 beanName,本文我们就来看看 Spring 中三种处理不同情况的 beanName生成器吧
    2023-09-09
  • @PathVariable获取路径中带有 / 斜杠的解决方案

    @PathVariable获取路径中带有 / 斜杠的解决方案

    这篇文章主要介绍了@PathVariable获取路径中带有 / 斜杠的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Spring Boot集成LiteFlow规则引擎的详细过程

    Spring Boot集成LiteFlow规则引擎的详细过程

    本文详细介绍了如何在Spring Boot应用程序中集成LiteFlow规则引擎,并探讨如何使用LiteFlow库来实现业务流程的规则处理,将通过具体的示例来展示如何在Spring Boot应用程序中配置和使用LiteFlow规则引擎,以提高系统的灵活性和可维护性,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • Java将一个正整数分解质因数的代码

    Java将一个正整数分解质因数的代码

    这篇文章主要介绍了将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5,需要的朋友可以参考下
    2017-02-02
  • Java文件上传与文件下载实现方法详解

    Java文件上传与文件下载实现方法详解

    这篇文章主要介绍了Java文件上传与文件下载实现方法,结合实例形式详细分析了Java文件上传与文件下载相关操作原理、实现方法及相关操作注意事项,需要的朋友可以参考下
    2019-02-02
  • Java MyBatis之Mapper代理详解

    Java MyBatis之Mapper代理详解

    这篇文章主要介绍了Java web中MyBatis的mapper代理,文中有详细的代码示例,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2023-04-04
  • java8保姆级lambda表达式教程

    java8保姆级lambda表达式教程

    这篇文章主要介绍了Java8之后的Lambda表达式的用法,lambda表达式将大量替代匿名内部类的使用,简化代码的同时,更突出了原来匿名内部类中最重要的那部分包含真正逻辑的代码,需要的朋友可以参考下
    2023-03-03
  • maven项目install时忽略执行test方法的总结

    maven项目install时忽略执行test方法的总结

    这篇文章主要介绍了maven项目install时忽略执行test方法的总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java代码混淆工具ProGuard使用指南(附有1.8以上和以下使用工具)

    Java代码混淆工具ProGuard使用指南(附有1.8以上和以下使用工具)

    ProGuard是一个开源的Java class文件缩小器、优化器、混淆器和预验证器,它通过删除未使用的类、字段、方法和属性,优化字节码指令,并重命名类、字段和方法,使反编译后的代码难以理解,从而提高应用的安全性,本文给大家详细介绍了ProGuard使用指南,需要的朋友可以参考下
    2025-05-05

最新评论