我的公众号: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代码,不便保护,而利用自定义注解和自注册的形式,能来源gaodaimacom搞#代%码网够不便应答需要的变更。本文只是提供一个大抵的思路,还有很多细节能够灵便变动,例如应用枚举类型、或者动态常量,作为订单的类型,置信你能想到更多更好的办法。
示例代码:https://github.com/ciphermagi…
的
举荐浏览
Java笔记大全.md
太赞了,这个Java网站,什么我的项目都有!https://markerhub.com
这个B站的UP主,讲的java真不错!