在Spring Boot中优化if-else语句
在Spring Boot中,优化if-else语句是提升代码质量、增强可读性和可维护性的重要手段。过多的if-else语句不仅会使代码变得复杂难懂,还可能导致代码难以扩展和维护。以下将介绍七种在Spring Boot中优化if-else语句的实战方法,每种方法都将结合示例进行说明。
1. 使用策略模式
策略模式是一种定义一系列算法的方法,将每一个算法封装起来,并使它们可相互替换。在Spring Boot中,策略模式非常适合用来替代多个if-else语句,特别是当这些if-else语句用于根据条件选择不同的执行路径时。
示例:假设有一个支付系统,需要根据不同的支付方式(如信用卡、支付宝、微信支付)执行不同的支付逻辑。
public interface PaymentStrategy {void pay(PaymentParamsDTO paymentParamsDTO, Long userId);
}@Component
public class CreditCardPaymentStrategy implements PaymentStrategy {@Overridepublic void pay(PaymentParamsDTO paymentParamsDTO, Long userId) {// 信用卡支付逻辑}
}@Component
public class AlipayPaymentStrategy implements PaymentStrategy {@Overridepublic void pay(PaymentParamsDTO paymentParamsDTO, Long userId) {// 支付宝支付逻辑}
}@Service
public class PaymentService {private final Map<String, PaymentStrategy> paymentStrategies = new HashMap<>();@Autowiredpublic PaymentService(List<PaymentStrategy> strategies) {for (PaymentStrategy strategy : strategies) {paymentStrategies.put(strategy.getClass().getSimpleName().toLowerCase(), strategy);}}public void processPayment(String paymentType, PaymentParamsDTO paymentParamsDTO, Long userId) {PaymentStrategy strategy = paymentStrategies.get(paymentType);if (strategy != null) {strategy.pay(paymentParamsDTO, userId);} else {throw new IllegalArgumentException("Unsupported payment type: " + paymentType);}}
}
2. 使用工厂模式
工厂模式用于创建对象,但不将对象的创建逻辑暴露给客户端,而是通过一个共同的接口来指向新创建的对象。在Spring Boot中,可以结合Spring的依赖注入功能,使用工厂模式来减少if-else语句。
示例:继续以支付系统为例,使用工厂模式来创建支付策略对象。
public class PaymentStrategyFactory {public PaymentStrategy getPaymentStrategy(String paymentType) {switch (paymentType) {case "credit_card":return new CreditCardPaymentStrategy();case "alipay":return new AlipayPaymentStrategy();default:throw new IllegalArgumentException("Unsupported payment type: " + paymentType);}}
}// 在PaymentService中使用工厂模式
@Service
public class PaymentService {private final PaymentStrategyFactory paymentStrategyFactory;@Autowiredpublic PaymentService(PaymentStrategyFactory paymentStrategyFactory) {this.paymentStrategyFactory = paymentStrategyFactory;}public void processPayment(String paymentType, PaymentParamsDTO paymentParamsDTO, Long userId) {PaymentStrategy strategy = paymentStrategyFactory.getPaymentStrategy(paymentType);strategy.pay(paymentParamsDTO, userId);}
}
注意:在Spring Boot中,通常不需要手动创建工厂类,而是利用Spring的依赖注入功能来管理Bean的创建和注入。上面的示例主要是为了演示工厂模式的概念。
3. 使用责任链模式
责任链模式是一种行为设计模式,它允许你将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
示例:在Spring Boot中,可以使用责任链模式来处理一系列可能的请求条件。
public interface Handler {void handleRequest(Request request);
}public class ConcreteHandlerA implements Handler {private Handler nextHandler;public ConcreteHandlerA(Handler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleRequest(Request request) {if (request.getCondition().equals("conditionA")) {// 处理条件A下的逻辑} else {if (nextHandler != null) {nextHandler.handleRequest(request);}}}
}// 类似地,可以定义ConcreteHandlerB, ConcreteHandlerC等//
### 4. 使用Map代替if-else进行简单条件映射对于简单的条件映射,如根据不同的枚举值或字符串执行不同的方法,可以使用`Map<KeyType, ValueOrAction>`来替代多个if-else语句。其中,`KeyType`是条件类型(如枚举、字符串等),`ValueOrAction`是对应的值或要执行的动作(如方法)。引用、Lambda表达式等**示例**:```java
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;public class SimpleMapper {private final Map<String, Consumer<String>> actions = new HashMap<>();public SimpleMapper() {actions.put("action1", this::handleAction1);actions.put("action2", this::handleAction2);// 可以继续添加更多映射}private void handleAction1(String param) {// 处理action1的逻辑System.out.println("Handling action1 with param: " + param);}private void handleAction2(String param) {// 处理action2的逻辑System.out.println("Handling action2 with param: " + param);}public void executeAction(String actionType, String param) {Consumer<String> action = actions.get(actionType);if (action != null) {action.accept(param);} else {throw new IllegalArgumentException("Unsupported action type: " + actionType);}}
}
5. 使用枚举与策略模式结合
当条件判断基于枚举类型时,可以将枚举类型与策略模式结合使用,使每个枚举值都关联一个具体的策略实现。
示例:
public enum PaymentType {CREDIT_CARD(new CreditCardPaymentStrategy()),ALIPAY(new AlipayPaymentStrategy()),// 可以继续添加更多支付方式;private final PaymentStrategy strategy;PaymentType(PaymentStrategy strategy) {this.strategy = strategy;}public PaymentStrategy getStrategy() {return strategy;}
}// PaymentStrategy 和 PaymentStrategy 的实现类保持不变// 使用方式
public void processPayment(PaymentType paymentType, PaymentParamsDTO paymentParamsDTO, Long userId) {paymentType.getStrategy().pay(paymentParamsDTO, userId);
}
6. 使用设计模式结合Spring的Bean管理
在Spring Boot中,可以充分利用Spring的Bean管理功能来优化设计模式的使用。例如,在策略模式或工厂模式中,可以直接将策略类或工厂类注册为Spring Bean,然后通过@Autowired注入到需要使用它们的地方。
这种方式的好处是减少了手动创建和管理对象的复杂性,同时利用了Spring的依赖注入和生命周期管理功能。
7. 使用表达式语言(如SpEL)
虽然Spring表达式语言(SpEL)通常用于配置文件中,但在某些情况下,它也可以用于代码中,以替代硬编码的if-else逻辑。然而,需要注意的是,SpEL主要用于配置和查询,并不完全适用于所有编程逻辑。
不过,在Spring Boot中,你可以考虑将某些决策逻辑移至配置文件或外部化配置中,并使用SpEL来解析这些配置,从而间接地减少代码中的if-else语句。
示例(虽然不太常见,但可作为思路):
假设你有一个根据环境变量决定数据库连接配置的场景,可以在application.properties或application.yml中使用SpEL表达式来决定某些值,然后在代码中读取这些配置。
然而,对于大多数复杂的业务逻辑,建议使用上述的设计模式或Map映射等方法来优化if-else语句。
总结
在Spring Boot中优化if-else语句的方法多种多样,选择哪种方法取决于具体的应用场景和需求。策略模式、工厂模式、责任链模式等设计模式是处理复杂条件逻辑的强大工具,而Map映射和枚举结合策略模式则适用于简单的条件映射。此外,充分利用Spring的依赖注入和Bean管理功能,可以进一步简化代码,提高可维护性。最终,目标是使代码更加清晰、易于理解和维护。
相关文章:
在Spring Boot中优化if-else语句
在Spring Boot中,优化if-else语句是提升代码质量、增强可读性和可维护性的重要手段。过多的if-else语句不仅会使代码变得复杂难懂,还可能导致代码难以扩展和维护。以下将介绍七种在Spring Boot中优化if-else语句的实战方法,每种方法都将结合示…...
【Django】开源前端库bootstrap,常用
文章目录 下载bootstrap源文件到本地项目引入bootstrap文件 官网:https://www.bootcss.com/V4版本入口:https://v4.bootcss.com/V5版本入口:https://v5.bootcss.com/ 这里使用成熟的V4版本,中文文档地址:https://v4.b…...
2024后端开发面试题总结
一、前言 上一篇离职贴发布之后仿佛登上了热门,就连曾经阿里的师兄都看到了我的分享,这波流量真是受宠若惊! 回到正题,文章火之后,一些同学急切想要让我分享一下面试内容,回忆了几个晚上顺便总结一下&#…...
opencascade AIS_Manipulator源码学习
前言 AIS_Manipulator 是 OpenCASCADE 库中的一个类,用于在3D空间中对其他交互对象或一组对象进行局部变换。该类提供了直观的操控方式,使用户可以通过鼠标进行平移、缩放和旋转等操作。 详细功能 交互对象类,通过鼠标操控另一个交互对象…...
Hadoop、Hive、HBase、数据集成、Scala阶段测试
姓名: 总分:Hadoop、Hive、HBase、数据集成、Scala阶段测试 一、选择题(共20道,每道0.5分) 1、下面哪个程序负责HDFS数据存储( C ) A. NameNode B. Jobtracher C. DataNode D. Sec…...
go语言day19 使用git上传包文件到github Gin框架入门
git分布式版本控制系统_git切换head指针-CSDN博客 获取请求参数并和struct结构体绑定_哔哩哔哩_bilibili (gin框架) GO: 引入GIn框架_go 引入 gin-CSDN博客 使用git上传包文件 1)创建一个github账户,进入Repositories个人仓…...
Ubuntu升级软件或系统
Ubuntu升级软件或系统 升级Ubuntu系统通常是一个相对简单的过程,但在进行操作之前,请务必备份重要数据以防万一。下面是升级Ubuntu系统的一般步骤: 使用软件更新工具升级系统 打开终端: 按下 Ctrl Alt T 组合键打开终端。 更…...
【Redis】Centos7 安装 redis(详细教程)
查看当前 Redis 版本: 当前的 redis 版本太老了,选择安装 Redis5。 一、使用 yum 安装 1、首先安装 scl 源 yum install centos-release-scl-rh 由于我之前已经安装过了,所以加载速度比较快,且显示已经安装成功,是最…...
Hakuin:一款自动化SQL盲注(BSQLI)安全检测工具
关于Hakuin Hakuin是一款功能强大的SQL盲注漏洞安全检测工具,该工具专门针对BSQLi设计,可以帮助广大研究人员优化BSQLi测试用例,并以自动化的形式完成针对目标Web应用程序的漏洞扫描与检测任务。 该工具允许用户以轻松高效的形式对目标Web应…...
在 Postman 中设置全局 token
目录 问题描述解决方案 问题描述 在使用 Postman 进行接口测试时,经常会遇到在 Header 中添加 token 的情况。当接口数量较多时,需要为每个接口进行设置,而且当 token 失效时需要重新获取并设置,这样一来效率较低。 解决方案 下…...
Linux C编程:打造一个插件系统
title: ‘Linux C编程:打造一个插件系统’ date: 2017-03-07 21:16:36 tags: linux C layout: post comments: true 运行环境:linux 使用语言:c 或者c 插件,很多人用过,比如游戏插件,编辑器插件这些, 最著…...
基于毫米波生物感知雷达+STM32设计的独居老人居家监护系统(微信小程序)(192)
基于毫米波生物感知雷达设计的独居老人居家监护系统(微信小程序)(192) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】60G毫米波生物感知雷达原理【3】ESP8266模块配置【4】供电方式1.3 项目开发背景【1】选题的意义…...
C++——类和对象(下)
目录 一、再探构造函数 1.基本定义以及用法 2.必须在初始化列表初始化的成员变量 3.成员变量声明位置的缺省值(C11) 4.成员变量初始化顺序 二、隐式类型转换 三、static成员 四、友元 五、内部类 六、匿名对象 七、日期类实现 一、再探构造函数…...
Android中集成前端页面探索(Capacitor 或 Cordova 插件)待完善......
探索目标:Android中集成前端页面 之前使用的webview加载html页面,使用bridge的方式进行原生安卓和html页面的通信的方式,探索capacitor-android插件是如何操作的 capacitor-android用途 Capacitor 是一个用于构建现代跨平台应用程序的开源框…...
玩转CSS:用ul li +JS 模拟select,避坑浏览器不兼容。
玩转CSS:用ul li JS 模拟select,避坑浏览器不兼容。 在前端的工作中,经常会遇到 selcet控件,但我们用css来写它的样式时候,总是不那么令人满意,各种浏览器不兼容啊有没有? 那么,我…...
介绍下PolarDB
业务中用的是阿里云自研的PolarDB,分析下PolarDB的架构。 认识PolarDB 介绍 PolarDB是阿里云自研的,兼容MySQL、PostageSQL以及支持MPP的PolarDB-X的高可用、高扩展性的数据库。 架构 部署 云起实验室 - 阿里云开发者社区 - 阿里云 (aliyun.com) 数…...
基于微信小程序+SpringBoot+Vue的儿童预防接种预约系统(带1w+文档)
基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 开发合适的儿童预防接种预约微信小程序,可以方便管理人员对儿童预防接种预约微信小程序的管理,提高信息管理工作效率及查询…...
go语言day15 goroutine
Golang-100-Days/Day16-20(Go语言基础进阶)/day17_Go语言并发Goroutine.md at master rubyhan1314/Golang-100-Days GitHub 第2讲-调度器的由来和分析_哔哩哔哩_bilibili 一个进程最多可以创建多少个线程?-CSDN博客 引入协程 go语言中内置了协程goroutine&#…...
Mindspore框架循环神经网络RNN模型实现情感分类|(六)模型加载和推理(情感分类模型资源下载)
Mindspore框架循环神经网络RNN模型实现情感分类 Mindspore框架循环神经网络RNN模型实现情感分类|(一)IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|(二)预训练词向量 Mindspore框架循环神经网络RNN模型实现…...
System类
System类常见方法 ① exit 退出当前程序 public static void main(String[] args) {System.out.println("ok1");//0表示状态,即正常退出System.exit(0);System.out.println("ok2");} ② arraycopy 复制数组元素 复制的数组元素个数必须<原数…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
