乐趣区

关于springboot:在-Spring-Boot-中如何干掉-if-else

我的公众号:MarkerHub,Java 网站:https://markerhub.com

更多精选文章请点击:Java 笔记大全.md

小 Hub 领读

干掉 if else 罕用策略模式,记得了哈!其实就是抽取一个抽象类,而后依据类型指定不同的实现类执行办法。你学废了吗?


  • 作者:cipher
  • https://juejin.im/post/5c5511…

需要

这里虚构一个业务需要,让大家容易了解。假如有一个订单零碎,外面的一个性能是依据订单的不同类型作出不同的解决。

订单实体:

service 接口:

传统实现

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

策略模式实现

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

能够看到下面的办法中注入了 HandlerContext,这是一个处理器上下文,用来保留不同的业务处理器,具体在下文会解说。咱们从中获取一个形象的处理器 AbstractHandler,调用其办法实现业务逻辑。

当初能够理解到,咱们次要的业务逻辑是在处理器中实现的,因而有多少个订单类型,就对应有多少个处理器。当前需要变动,减少了订单类型,只须要增加相应的处理器就能够,上述 OrderServiceV2Impl 齐全不需改变。

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

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

自定义注解 @HandlerType:

形象处理器 AbstractHandler:

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

具体思路是:

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

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

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

咱们将外围的性能封装在 HandlerProcessor 类中,实现下面的性能。

HandlerProcessor:

ClassScanner:扫描工具类源码

HandlerProcessor 须要实现 BeanFactoryPostProcessor,在 spring 解决 bean 前,将自定义的 bean 注册到容器中。

外围工作曾经实现,当初看看 HandlerContext 如何获取对应的处理器:

HandlerContext:

BeanTool:获取 bean 工具类

#getInstance 办法依据类型获取对应的 class,而后依据 class 类型获取注册到 spring 中的 bean。

最初请留神一点,HandlerProcessor 和 BeanTool 必须能被扫描到,或者通过 @Bean 的形式显式的注册,能力在我的项目启动时发挥作用。

总结

利用策略模式能够简化繁冗的 if else 代码,不便保护,而利用自定义注解和自注册的形式,能够不便应答需要的变更。本文只是提供一个大抵的思路,还有很多细节能够灵便变动,例如应用枚举类型、或者动态常量,作为订单的类型,置信你能想到更多更好的办法。

示例代码:https://github.com/ciphermagi…

举荐浏览

Java 笔记大全.md

太赞了,这个 Java 网站,什么我的项目都有!https://markerhub.com

这个 B 站的 UP 主,讲的 java 真不错!

退出移动版