共计 1415 个字符,预计需要花费 4 分钟才能阅读完成。
我的公众号: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 真不错!