springboot-策略和模板模式的思考与实践

简介: 前言在日常的开发过程中,经常会遇到一些复杂的业务场景,那么如何优雅的实现复杂的业务功能,而且使得系统的性能、可靠性、可读性达到最好呢?这里不仅考验着开发者的编程功底,实践能力,还有对局部和全局的把握能力。我们都知道,java 是面向对象编程的语言而非面向过程编程的语言,但是在实际操作中,常常会为了走捷径实现功能,忽略了代码的结构性建设,久而久之项目就是堆砌成屎山,系统性能降低,可读性差,系统的可维护性降低,扩展难度极大。为了解决这样的问题,就需要开发者修炼自己的设计功底,学好并用好设计模式。在本文要谈的就是对策略和模板设计模式使用心得与体会。

前言

在日常的开发过程中,经常会遇到一些复杂的业务场景,那么如何优雅的实现复杂的业务功能,而且使得系统的性能、可靠性、可读性达到最好呢?这里不仅考验着开发者的编程功底,实践能力,还有对局部和全局的把握能力。我们都知道,java 是面向对象编程的语言而非面向过程编程的语言,但是在实际操作中,常常会为了走捷径实现功能,忽略了代码的结构性建设,久而久之项目就是堆砌成屎山,系统性能降低,可读性差,系统的可维护性降低,扩展难度极大。为了解决这样的问题,就需要开发者修炼自己的设计功底,学好并用好设计模式。在本文要谈的就是对策略和模板设计模式使用心得与体会。

2 应用场景

之所以会将策略和模板模式放在一起,是因为这两种模式用的最多最广泛,而且基本都是联合使用的。在开始之前,先复习一下模式的定义:

  • 模板模式(Template Pattern)

模板模式是在一个抽象类中定义执行的方法,每个方法中都有一个对应的业务流程模板,它的子类需要按照需要来重写模板流程中的方法,调用方法将以抽象类中的方式进行,这种设计模式也属于行为型模式。

  • 策略模式(Strategy Pattern)

策略模式是指一个类的行为或者方法,可以在运行时根据条件进行修改,策略模式也是一种行为性模式。在使用策略模式时,通常会创建一个策略上下文 Context ,根据不同的情况选择不同的策略。

不管是策略模式还是模板模式,都是运用了 java 多态这一特点,父类引用指向之类对象,通常情况下,模板模式使用的是抽象类,而策略模式使用的是接口而已。其子类都需要子类重写其父类方法或者实现接口方法,两者都满足开闭原则,使得系统在不影响其它功能的前提下更容易扩展。但是两者又有一些差异,模板模式是一种耦合的模式,策略模式是一种松散的模式。模板模式中,通常只有一个业务方法的入口,策略模式中的接口通常会有多个。

单纯的策略模式和模板模式在实践中应用很少,一般都是两种模式结合起来使用,如下图所示,这里即使用了模板模式的高内聚的业务流程,也使用了策略模式的松散性,相同的内容放在抽象类中进行处理,特有的内容放在具体的实现类里面进行操作。

3 应用实践

在介绍了其应用场景后,在这里将结合实际的业务场景来介绍两种设计模式的合并使用。这里采用的是下单支付的场景,用户下单支付完成后,需要邮件和短信通知用户,并且给用户发积分并发送 MQ。

首先,我们需要定义一个接口类,如下图所示,定义了业务流程方法,发送邮件以及发送短信等方法。

实现接口的模板抽象类,定义了业务的流程顺序,以及抽象的支付方法。同时也实现了实现了发送短信和邮件的方法,还有一个发送消息的方法。

阿里业务类型实现类,这里实现了支付的方法,以及发送短信和邮件的方法,这里不同的业务可能配置不同的短信发送服务,通用的短信发送在抽象模板进行处理,特有的可以在具体的实现类里面实现。

其它两个微信和网银的实现类就不在这里展示了,和阿里的业务类似,具体的可以参见项目代码。

通过以上的操作,我们已经实现了业务骨架编码,但是该怎么调用呢?这里提供了两种方法,一是使用 spring 注入的方式,另外是使用枚举,通过 ApplicationContext 获取对应的 bean。

通过 @Autowired 来注入 private Map<String, BaseBusiness> businessMap;, 这里需要具体的实现类名称不能有重复,第一种就是通过接口传入的 payType 通过判断来获取对应的 BaseBusiness。第一种方式需要写多个 if 判断条件,显然不是很优雅。

在介绍第二种方式之前,先来看一个枚举类,这个枚举类比较特殊,定义了支付类型,Bean 名称和业务描述以及对应的 Bean Class。这里定义了一个 matchBusiness 方法,在该方法中使用 SpringUtils 工具类从 Spring 上下文获取对应的 Bean, 这里使用的是 Class 来获取 Bean, 当然也可以使用 Bean 名称来获取 Bean。

通过以上方式,我们就可以很方便的使用模板和策略模式的结合体,能够很方便的实现业务功能。

4 总结

在本文中,使用了一个案例来分享作者对策略模式和模板模式理解和应用,综合使用两种模式的优点,两者的结合避免了一些不足。在使用时,没有使用常用的上下文对象来获取对应的业务处理器,而是使用了一个枚举类来实现,这样通过该枚举类就可以从宏观来了解所有的策略,并且减少了一些判断的代码,使得代码简练,结构清晰。

相关文章
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
933 0
|
8月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
995 0
|
8月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
264 0
|
6月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
246 1
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
982 2
|
消息中间件 Java 调度
Spring Boot 3.3 后台任务处理的高效策略
【10月更文挑战第18天】 在现代应用程序中,后台任务处理对于提升用户体验和系统性能至关重要。Spring Boot 3.3提供了多种机制来实现后台任务处理,包括异步方法、任务调度和使用消息系统。本文将探讨这些机制的最佳实践,帮助开发者提高应用程序的效率和响应速度。
250 0
|
8月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,处理前后端日期交互是一个常见问题。本文通过 **@DateTimeFormat** 和 **@JsonFormat** 两个注解,详细讲解了如何解析前端传来的日期字符串以及以指定格式返回日期数据。文章从实际案例出发,结合代码演示两者的使用场景与注意事项,解决解析失败、时区偏差等问题,并提供全局配置与局部注解的实践经验。帮助开发者高效应对日期时间格式化需求,提升开发效率。
2170 2
|
11月前
|
负载均衡 IDE Java
SpringBoot整合XXL-JOB【04】- 以GLUE模式运行与执行器负载均衡策略
在本节中,我们将介绍XXL-JOB的GLUE模式和集群模式下的路由策略。GLUE模式允许直接在线上改造方法为定时任务,无需重新部署。通过一个测试方法,展示了如何在调度中心配置并使用GLUE模式执行定时任务。接着,我们探讨了多实例环境下的负载均衡策略,确保任务不会重复执行,并可通过修改路由策略(如轮训)实现任务在多个实例间的均衡分配。最后,总结了GLUE模式和负载均衡策略的应用,帮助读者更深入理解XXL-JOB的使用。
571 9
SpringBoot整合XXL-JOB【04】-  以GLUE模式运行与执行器负载均衡策略
|
10月前
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
1743 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
692 5