设计模式之模板方法模式(Java实现)

举报
长路 发表于 2022/11/28 18:15:38 2022/11/28
【摘要】 文章目录前言一、认识模板方法二、实现模板方法总结参考资料 前言 本篇博客是关于模板方法模式的实现,若文章中出现相关问题,请指出! 对应代码地址:Gitee(demo-exer/ java-Lear23designpatterns)、Github(java-demo/ java-Lear23designpatterns) 所有博客文件目录索引:博客目录索引(持续更新) 一、认识模板方法 模板方法定义

@[toc]

前言

本篇博客是关于模板方法模式的实现,若文章中出现相关问题,请指出!

对应代码地址:Gitee(demo-exer/ java-Lear23designpatterns)Github(java-demo/ java-Lear23designpatterns)

所有博客文件目录索引:博客目录索引(持续更新)

一、认识模板方法

模板方法定义:定义一个操作中的算法骨架(执行骨架),并将算法的一些步骤延迟到子类中让开发者取实现,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。

结构

  • 抽象类
    • 模板方法:定义了整个执行流程的骨架,按照顺序来调用其中的基本方法。
    • 基本方法:已经实现了的在执行流程中的方法,基本类型如下
      • 抽象方法:在抽象类中声明,由具体子类实现。
      • 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
      • 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
  • 具体类(继承抽象类):实现抽象类中所定义的抽象方法和钩子方法。

image-20210319230011319

优缺点

  • 优点:封装了不变部分,扩展可变部分;在父类中提取了公共的部分代码,便于代码复用;抽象类中定义了部分抽象方法来让子类实现,子类可通过扩展方式增加相应的功能,符合开闭原则
  • 缺点:对于每一个不同的实现都要定义一个子类,导致类的个数增大,间接增加了系统实现的复杂度;提升了代码阅读的难度;若是抽象父类添加了新的抽象方法,那么所有的子类都要改一遍,这就又不符合开闭原则

应用场景

  1. servlet中的HttpServlet抽象类中的service()方法相当于模板方法,其中包含了各种请求方法(doGet、doPost)的调用,并且请求方法可以通过继承的方式来去实现,让开发者进行自定义操作。
    • 需要引入servlet-apijar包。
  2. SpringMVC中的AbstractController抽象类中的handleRequest()方法也相当与模板方法。其中包含了对请求方法的判断,该类中提供了一个抽象方法handleRequestInternal()让用户进行自定义。
    • 需要引入spring-webjar包


二、实现模板方法

demo见xyz.changlu.template包下代码:

image-20210319224252023

抽象类:AbstractTemplate

//抽象模板类
public abstract class AbstractTemplate {

    //一整套数据库查询方法(连接数据库、执行查询操作、关闭连接操作)
    public void templateMethod(){
        System.out.println("初始化操作");
        System.out.println("连接数据库操作");
        abstractMethod1();
        abstractMethod2();
        System.out.println("关闭连接操作");
    }

    public abstract void abstractMethod1();

    public abstract void abstractMethod2();
}
  • 其中定义了一个模板方法,对于一些非核心业务的流程直接已经帮你实现,而核心业务方法设置为指定的抽象方法,让开发者自己去实现。

具体抽象类:ConcreteTemplate

//具体模板类:实现具体的核心业务功能
public class ConcreteTemplate extends AbstractTemplate {
    @Override
    public void abstractMethod1() {
        System.out.println("执行query()查询操作");
    }

    @Override
    public void abstractMethod2() {
        System.out.println("执行update()更新操作");
    }
}
  • 实现了模板方法的两个抽象方法(即核心方法)。

测试程序:测试类Customer

//测试类
public class Customer {
    public static void main(String[] args) {
        AbstractTemplate template = new ConcreteTemplate();
        template.templateMethod();//执行模板方法
    }
}

image-20210319225048135



总结

模板方法模式常常用于定义一个执行过程骨架(使用一个抽象类包含一个具体方法,该方法中是相应的执行流程,并且还有个抽象方法让开发者自定义),对于一些核心方法可以让开发者去继承该抽象类并实现方法。在框架的很多地方都使用到了该模式!!!简化了开发者许多不必要的操作,让开发者只需要专注于主要的业务开发即可!不过这样的话对于小白就不太友好了。



参考资料

视频:2020年最详细的23种Java设计模式完整视频教程全集 模板方法模式及实际框架应用

[1]. C语言中文网—模板方法模式(模板方法设计模式)详解

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。