首页 > 其他分享 >Springboot整合模版方法模式概念->原理优缺点->框架应用场景->企业级实战

Springboot整合模版方法模式概念->原理优缺点->框架应用场景->企业级实战

时间:2023-08-18 10:01:07浏览次数:41  
标签:Springboot 模版 void 企业级 算法 子类 方法 模板 name

一、前言

常见的设计模式有23种,我们不得不提到模板方法设计模式,这是一种在软件开发中广泛使用的行为型设计模式之一。 它为我们提供了一种优雅的方式来定义算法的结构,并将算法的具体实现延迟到子类中!

在本篇博客中,我们将深入探讨模板方法设计模式在Spring Boot中的应用。我们将从概念入手,逐步展开,探究模板方法设计模式原理优缺点开源框架应用场景以及如何在企业级灵活应用

如果您正在寻找一种能够提升代码重用性、可维护性和可扩展性的方法,这篇博客一定要收藏。

二、什么是模板方法

全称是模板方法设计模式,英文是 Template Method Design Pattern。 在 GoF 的《设计模式》一书中,它是这么定义的:

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.

翻译成中文就是:「模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。」

这里的“算法”,我们可以理解为广义上的“业务逻辑”,并不特指数据结构和算法中的“算法”。这里的算法骨架就是“模板”,包含算法骨架的方法就是“模板方法”,这也是模板方法模式名字的由来。

「白话讲就是:创建一个抽象类并在里面定义一些方法,有的抽象类本身已经实现,实现方法的复用,有的需要子类去实现提高扩展性!」

三、模板方法的原理

模板方法的原理可以简单概括如下:

  • 「定义算法骨架」:在抽象基类中定义一个模板方法,该方法包含了算法的整体流程,通常由一系列步骤组成。这些步骤可以是抽象方法、具体方法或空方法(钩子方法)。
  • 「子类定制实现」:子类继承基类,并实现其中的抽象方法,以提供算法的具体实现。子类可以根据需要定制算法的某些步骤,而不必修改整个算法的结构。
  • 「模板方法的调用」:在客户端代码中,通过调用抽象基类的模板方法来启动算法。模板方法按照定义的流程调用了各个步骤,以及可能的具体方法或钩子方法。

总之,通过这种方式,模板方法设计模式实现了方法的复用,可以更好去扩展,同时将算法的整体结构清晰地展现在一个方法中,使得代码易于理解和维护。

四、优缺点

1. 优点

  • 「代码复用」: 模板方法模式鼓励代码重用,将通用的算法框架放在抽象类中,可以在多个子类中共享这些通用部分的代码,减少了重复编写代码的工作。
  • 「扩展性」: 子类可以通过实现抽象方法或覆盖钩子方法来扩展或定制算法的具体步骤,随时可以扩展,不影响之前代码。
  • 「结构清晰」: 模板方法模式能够将算法的整体结构清晰地体现出来,使得代码更易于理解和维护。
  • 「符合开闭原则」: 模板方法模式支持开闭原则,因为算法框架在抽象类中定义,具体步骤可以在子类中扩展,而不需要修改抽象类的代码。

2. 缺点

  • 「限制灵活性」: 由于模板方法模式固定了算法的整体框架,有时可能会限制一些特定情况下的灵活性。如果需要更细粒度的控制,可能需要通过扩展抽象类来解决。
  • 「增加复杂性」: 尽管模板方法模式可以使代码结构更清晰,但也引入了抽象类和具体子类之间的层次关系,可能会增加代码的复杂性。
  • 「难以理解」: 对新手不友好,可能需要一些时间来理解算法框架和各个具体步骤之间的关系。

五、开源框架应用场景

  • Java中的java.io.InputStream/OutputStream: Java的输入输出流类中使用了模板方法模式。这些类提供了一系列的抽象方法,子类必须实现这些方法来完成底层的读写操作。然而,这些类也提供了一些具体的方法,如read和write,这些方法实际上调用了一系列的抽象方法,构成了一个完整的读写算法框架。
  • Servlet中的HttpServlet: Java Servlet规范中的HttpServlet类也使用了模板方法模式。HttpServlet类提供了service方法来处理HTTP请求,而具体的处理逻辑则通过覆盖doGet、doPost等方法来实现。
  • JUnit测试框架中的TestCase: JUnit测试框架中的TestCase类使用了模板方法模式来定义测试用例的执行流程。用户可以通过覆盖setUp和tearDown等方法来定制测试环境的设置和清理。
  • Java Swing中的JApplet: Java Swing中的JApplet类也是一个使用模板方法模式的例子。它定义了init、start、stop等方法来控制Applet的生命周期。

有很多博客都会说Spring框架中的JdbcTemplate也是模版方法模式的实践,看了王争老师的课才知道,它并非基于模板模式来实现的,而是基于回调来实现的,确切地说应该是同步回调。

可以看一下JdbcTemplate源码:

@Override
public void execute(final String sql) throws DataAccessException {
 if (logger.isDebugEnabled()) {
  logger.debug("Executing SQL statement [" + sql + "]");
 }

 /**
  * Callback to execute the statement.
  */
 class ExecuteStatementCallback implements StatementCallback<Object>, SqlProvider {
  @Override
  @Nullable
  public Object doInStatement(Statement stmt) throws SQLException {
   stmt.execute(sql);
   return null;
  }
  @Override
  public String getSql() {
   return sql;
  }
 }

 execute(new ExecuteStatementCallback(), true);
}

六、项目实战

看了开源框架使用这么多,自己也模拟一个简单的案例,来体会一下模版方法的魅力!

我们来写模拟人的一生,经历五个阶段:出生、上学、工作、退休、死亡

其中出生和死亡都是不变的流程,我们进行复用! 上学、工作、退休每个人的人生都是不同的,等着他们自己去实现,这样来一个新的人都可以创建一个子类去实现,完成了扩展性

下面我们开始吧!

1. 创建父类构造类

/**
 * 人的一生模版
 * @author wangzhenjun
 * @date 2023/8/16 15:07
 */
public abstract class PersonTemplate {

    /**
     * 人的一生经历的阶段
     * @param name
     */
    public final void lifeCycle(String name) {
        birth(name);
        education(name);
        work(name);
        retirement(name);
        death(name);
    }

    /**
     * 教育
     * @param name
     */
    protected abstract void education(String name);

    /**
     * 工作
     * @param name
     */
    protected abstract void work(String name);

    /**
     * 退休
     * @param name
     */
    protected abstract void retirement(String name);

    /**
     * 出生
     * @param name
     */
    protected void birth(String name) {
        System.out.println(name + "哇哇落地了!");
    }

    /**
     * 死亡
     * @param name
     */
    protected void death(String name) {
        System.out.println(name + "退出历史的舞台了!");
    }

}

「这里父类的方法,如果不想子类去实现,就可以加上final修饰,这个看自己需要,或者不需要每一个都让子类去实现,可以定义空的方法,有需要的子库去实现!」

如果是我们的业务复杂这里就自己去拓展方法的参数,来进行后续的操作!

2. 创建子类

/**
 * @author wangzhenjun
 * @date 2023/8/16 16:30
 */
@Component
public class LiHuaPerson extends PersonTemplate{

    @Override
    protected void education(String name) {
        System.out.println(name + "博士毕业了!");
    }

    @Override
    protected void work(String name) {
        System.out.println(name + "当上了上市公司CEO!");
    }

    @Override
    protected void retirement(String name) {
    System.out.println(name + "留在公司当顾问,不需要上班,工资照发!");
    }
}
/**
 * @author wangzhenjun
 * @date 2023/8/16 16:30
 */
@Component
public class TomPerson extends PersonTemplate{

    @Override
    protected void education(String name) {
        System.out.println(name + "大学毕业了!");
    }

    @Override
    protected void work(String name) {
        System.out.println(name + "当上了公务员!");
    }

    @Override
    protected void retirement(String name) {
        System.out.println(name + "正常退休,过上遛狗养花的快乐生活!");
    }
}

这里就粘贴两个子类,样子都是一样的!

3. 创建测试类

@SpringBootTest
class DemoNewApplicationTests {
    
    @Autowired
    private TomPerson tomPerson;
    @Autowired
    private LiHuaPerson liHuaPerson;

    @Autowired
    private PeterPerson peterPerson;

    @Test
    void contextLoads() {
        tomPerson.lifeCycle("Tom");
        liHuaPerson.lifeCycle("LiHua");
        peterPerson.lifeCycle("Peter");
    }
}

这里就是直接注入了三个子类实现,然后调用,正常业务一般是按需来调用流程,这时可以使用策略模式去改造一下调用端,这个就是按需来进行拓展!

如果对策略模式不了解可以看一下小编之前写的文章:

Springboot整合策略模式概念->使用场景->优缺点->企业级实战

然后结合一下这样模版方法+策略模式基本上比较完整了!

4. 测试结果

父类的实现方法也执行了,子类的实现方法也执行了!

Springboot整合模版方法模式概念->原理优缺点->框架应用场景->企业级实战_模板方法

在这里插入图片描述

七、总结

在Spring Boot项目中,整合模板方法设计模式能够帮助提高代码的重用性和可维护性,同时在保持一致性的基础上,为不同场景提供了灵活性。通过深入理解模板方法模式的原理、优缺点以及应用场景,我们可以更好地设计和实现具有高内聚、低耦合的代码。在实际开发中,合理地运用模板方法模式可以有效地提升代码质量和开发效率。

标签:Springboot,模版,void,企业级,算法,子类,方法,模板,name
From: https://blog.51cto.com/u_64214/7132014

相关文章

  • springboot 打包 时报错:The specified user settings file does not exist: F:\opt\
     解决方法:  ......
  • 【Spring boot】快速创建springboot项目
     1、文件-新建项目 2、选择spring填写信息 3、添加依赖包<后续可以在pom.xml中引入依赖包>  4、项目生成完成  ......
  • SpringBoot初体验
    1.何为SpringBoot简单理解:是集成于spring的优点继而简化spring配置SpringBoot简化了整个搭建与开发的过程当然,其通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。2.springboot优势(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插......
  • springboot综合案例综合案例第五课
    角色管理角色查询角色查询直接查询即可角色查询执行流程编写RoleMapper接口publicinterfaceRoleMapper{/***查询角色*/List<Role>findAll();}编写RoleServicepublicinterfaceRoleService{/***查询角色*@parampage......
  • 有关springboot的一些理解
    springboot概念springboot是spring项目的脚手架,其能够快速构建spring项目,不再需要一些对应用程序的xml文件配置,其自带许多硬件设备的驱动。其核心是约定大于配置理念,即减少人为配置,尽量采用默认的配置即可。例如,不同于单独的springMVC,其默认配置了包括tomcat服务器,视图解析器等......
  • SpringBoot+Mybatis-Plus+Mysql的保姆级搭建
    本文通过简单的示例代码和说明,让读者能够了解Mybatis-Plus+Mysql的简单使用必须说明的是,本文有部分内容是为了后续的微服务写的,所以如果只想用Mybatis-Plus的话,直接使用bank1项目即可 1.新建父项目,选用springinitializr即可,可以删除其他文件,仅仅留下pom文件当成父pom。修改......
  • SpringBoot操作前端传的Geojson进行空间查询
    SpringBoot操作前端传的Geojson进行空间查询项目说明:项目技术栈:SpringBoot+MybatisPlus+postgresql先上查询SQLSELECT*FROMdemoWHEREST_Intersects(geom,ST_GeomFromGeoJSON('放geojson类型数据'));表结构Controller层packagecom.itcy.postgresql.controller;importco......
  • RabbitMQ与SpringBoot 集成
    1、添加依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 2、添加配置官方配置https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/h......
  • springboot集成cas
    CAS介绍CAS是CentralAuthenticationService的缩写,中央认证服务,一种独立开放指令协议。CAS是耶鲁大学(YaleUniversity)发起的一个开源项目,旨在为Web应用系统提供一种可靠的单点登录方法,CAS在2004年12月正式成为JA-SIG的一个项目。特点:开源的企业级单点登录解决方案......
  • IDEA社区版+SpringBoot+MyBatisPLus+MySQL实现数据库的保存、查询、修改操作
    一、概述使用IDEA社区+SpringBoot+MyBatisPlus+MySQL实现数据的保存修改与查询。主要记录一下踩坑过程。注意事项:1.社区版IDEA并不能直接创建SpringBoot工程,所以我采用的方式是在Spring官网上,让其帮助我创建一个,创建好后,直接下载。//参考案例https://blog.csd......