java if else过多_Spring Boot中如何干掉过多的if else!

2582b13064dfe7cdb466389ef66adfdf.png

需求

这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。

订单实体:

6ae9c5e0378cc86bef6713b67f1d1293.png

service接口:

7ebd65f4744495e976ded3adf23d1955.png

传统实现

根据订单类型写一堆的if else:

b1a055f685b853f4225ce5795112b213.png

策略模式实现

利用策略模式,只需要两行即可实现业务逻辑:

28b406307be024b657b0af8eb1fffe42.png

可以看到上面的方法中注入了HandlerContext,这是一个处理器上下文,用来保存不同的业务处理器,具体在下文会讲解。我们从中获取一个抽象的处理器AbstractHandler,调用其方法实现业务逻辑。

现在可以了解到,我们主要的业务逻辑是在处理器中实现的,因此有多少个订单类型,就对应有多少个处理器。以后需求变化,增加了订单类型,只需要添加相应的处理器就可以,上述OrderServiceV2Impl完全不需改动。

我们先看看业务处理器的写法:

7af7f4b5321e5a5702cf48963266b424.png

8e97791a9a4bfd9b0be19a6f6d2f9679.png

9d24da518393f873e6a488f9f8b6a36b.png

首先每个处理器都必须添加到spring容器中,因此需要加上@Component注解,其次需要加上一个自定义注解@HandlerType,用于标识该处理器对应哪个订单类型,***就是继承AbstractHandler,实现自己的业务逻辑。

自定义注解 @HandlerType:

295822464fa6041bdcff549d8caa180b.png

抽象处理器 AbstractHandler:

b4b6968775d887ded8f4006a9a67049c.png

自定义注解和抽象处理器都很简单,那么如何将处理器注册到spring容器中呢?

具体思路是:

1、扫描指定包中标有@HandlerType的类;

2、将注解中的类型值作为key,对应的类作为value,保存在Map中;

3、以上面的map作为构造函数参数,初始化HandlerContext,将其注册到spring容器中;

我们将核心的功能封装在HandlerProcessor类中,完成上面的功能。

HandlerProcessor:

5fc3b39ad8a1187a6660b7430b7a7088.png

ClassScaner:

61912b63251f52f88930ffb5d6c60615.png

ClassScaner:扫描工具类源码

HandlerProcessor需要实现BeanFactoryPostProcessor,在spring处理bean前,将自定义的bean注册到容器中。

核心工作已经完成,现在看看HandlerContext如何获取对应的处理器:

HandlerContext:

4337a81b6182470f482582e822417df8.png

BeanTool:获取bean工具类

b4eaed38d61c2d98a7e0a515413c393f.png

#getInstance方法根据类型获取对应的class,然后根据class类型获取注册到spring中的bean。

***请注意一点,HandlerProcessor和BeanTool必须能被扫描到,或者通过@Bean的方式显式的注册,才能在项目启动时发挥作用。

总结

利用策略模式可以简化繁杂的if else代码,方便维护,而利用自定义注解和自注册的方式,可以方便应对需求的变更。本文只是提供一个大致的思路,还有很多细节可以灵活变化,例如使用枚举类型、或者静态常量,作为订单的类型,相信你能想到更多更好的方法。

【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件知识:固态硬盘相关知识介绍

目录 1、主控 2、固件算法 3、SSD的SATA接口与M.2接口 4、速度对比 今天就为大家全面科普一下固态硬盘的相关知识,让大家购买时做到心中有数,按需选择。 首先还是从SSD的结构来说起,SSD最基本的组成部件分为:主控芯片、闪存芯片、…

编码实战Web端联系人的增删改查

首先画出分析图 实现效果如图 项目下的包如图: 实体包 package com.contactSystem.entiey;public class Contact {private String Id;private String name;private String sex;private String age;private String phone;private String qq;private String email;pub…

选型java程序_Java程序员自动化指南

一、背景在Java web开发中,虽然Spring boot已经帮助我们简化了很多工作,但项目中庞杂的业务仍然需要自己去编写较多的 entity,vo,Mapper,Service, Controller 代码等,那么我们有没有什么办法来简…

网络知识:光猫光纤宽带故障排查笔记

在日常上网过程中出现的故障,很大一部分是由于线路和光猫故障引起,现简单介绍一下,如何处理这些故障。 现象一:不能上网(网络中断) 故障排查: 1、确认您的光猫信号灯是否正常: ①电源…

treeview自动从表中添加标题和列值做目录的方法2

treeview自动从表中添加标题和列值做目录的方法2,该方法是借鉴万一老师的 http://www.cnblogs.com/del/archive/2008/05/15/1114450.html 首先界面上添加treeview组件,然后在treeview的onchange事件里这样写: 因为要用到定义个过程&#xff0…

Linux常用运维命令笔记

今天给大家整理一下Linux常用的命令,希望对大家能有所帮助!MYSQL相关1、查看mysql版本status; select version()2、 mysql启动命令#01 使用 service 启动:service mysqld start (5.0版本) service mysql start (5.5.7版本) #02 使用 mysqld 脚…

电脑知识:如何将旧电脑文件迁移到新电脑中,包括操作系统

将旧电脑中的文件和操作系统全部转移到新电脑中,一般可以借助分区助手、磁盘精灵或者GHOST等磁盘工具。为了提高数据传输速度,可以将旧电脑的硬盘拆下安装到新电脑,然后使用PE工具盘引导电脑进入PE系统中,将旧电脑硬盘中的数据借助…

浏览器插件:一款解决谷歌浏览器吃内存神器插件

Chrome浏览器是大部分开发者必备的浏览器,它的主要有点有便于调试、启动快、无广告。但是谷歌浏览器也有自己的缺点,Chrome浏览器对系统内存的占用太大了,每打开一个页面都会占用系统内存。如果你的浏览器一下子打开几十个网页,不…

电脑软件:推荐两款好用的文件重复检测软件

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

APP技巧:微信中这6个设置建议关闭,可以防止个人信息或将全暴露

目录 01、 开启添加好友验证功能 02、 添加“我”的方式 03、不让他(她)看 04、允许陌生人查看10条朋友圈 05、 设置查看朋友圈范围 06、微信授权管理 相信提到微信,大家基本每天都在用,如今微信已经成为了我们社交软件中的第一大…

硬件知识:内存单根16G和两根8G差别有多大?

关于内存单根16G和两根8G的差别,小编觉得这些事实,你得知道! 论单根16G和两根8G的区别! 内存单通道和双通道,大家都有听过吧! 理解起来很简单,一个单通道,只能进行单向传输数据&…

操作系统:Win10的沙盒是什么,如何使用,看完你就懂了

Win10操作系统新增的windows沙盒是一种安全机制,为执行中的程式提供的隔离环境。通常是作为一些来源不可信、具有破坏力或无法判定程序意图的应用程序提供实验之用。很多网友想要通过沙盒运行一些未知的程序,但是不知道windows沙盒如何开启使用&#xff…

操作系统:电脑系统盘常见文件夹的功能详解

目录 一、C盘根目录常见文件夹 二、隐藏文件夹 相信很多电脑小白对于系统C盘每个文件夹的功能不是很清楚,今天小编给大家介绍一下电脑系统盘文件的功能详解,希望对大家能有所帮助! 一、C盘根目录常见文件夹 1、debug 是系统调试文件夹&#x…