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

相关文章

  • Spring Security Oauth2.0 实现短信验证码登录示例

    Spring Security Oauth2.0 实现短信验证码登录示例

    本篇文章主要介绍了Spring Security Oauth2.0 实现短信验证码登录示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Java实现Huffman编码的示例代码

    Java实现Huffman编码的示例代码

    Huffman编码是一种编码方式,本文主要介绍了Java实现Huffman编码的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • Springboot实例讲解实现专业材料认证管理系统流程

    Springboot实例讲解实现专业材料认证管理系统流程

    这是一个基于java的毕业设计项目,毕设课题为springboot框架的知识产权服务平台系统,是一个采用b/s结构的javaweb项目,需要的朋友可以参考下
    2022-06-06
  • 详细分析Java Lambda表达式

    详细分析Java Lambda表达式

    这篇文章主要介绍了Java Lambda表达式的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Java静态static与实例instance方法示例

    Java静态static与实例instance方法示例

    这篇文章主要为大家介绍了Java静态static与实例instance方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

    java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

    这篇文章主要介绍了从源码的角度浅析HashMap、TreeMap元素的存储和获取元素的逻辑;从Map与Set之间的关系浅析常用的Set中元素的存储和判断是否重复的逻辑,需要的朋友可以参考下
    2017-01-01
  • MyBatis-Plus忽略多租户隔离自定义注解

    MyBatis-Plus忽略多租户隔离自定义注解

    本文主要介绍了MyBatis-Plus忽略多租户隔离自定义注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • Java 中向 Arraylist 添加对象的示例代码

    Java 中向 Arraylist 添加对象的示例代码

    本文介绍了如何在 Java 中向 ArrayList 添加对象,并提供了示例和注意事项,通过掌握这些知识,读者可以在自己的 Java 项目中有效地使用 ArrayList 来存储和操作对象,需要的朋友可以参考下
    2023-11-11
  • JavaFX实现简易时钟效果(一)

    JavaFX实现简易时钟效果(一)

    这篇文章主要为大家详细介绍了JavaFX实现简易时钟效果的第一篇,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • SpringBoot使用jsr303校验的实现

    SpringBoot使用jsr303校验的实现

    这篇文章主要介绍了SpringBoot使用jsr303校验的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论