共计 3213 个字符,预计需要花费 9 分钟才能阅读完成。
作者:京东物流 钟磊
1 前言
最近在梳理接口逻辑的时候发现,代码中应用的策略和责任链设计模式给我留下了十分粗浅的印象。一个业务逻辑流程通常非常适合应用责任链和策略设计模式来实现,因为一个业务需要通常能够拆分成一个个独立的逻辑处理单元并按程序组合而成,而责任链设计模式能够很好的链接整个业务流程,同时策略设计模式能够将业务中变动的算法局部抽离进去,从而复用次要的公共逻辑并能够灵便替换业务算法,应用这两种设计模式能够灵便扩大咱们的代码以适应不同的业务需要。因为这两种设计模式十分实用,上面简略介绍一下我对这两种设计模式的了解和它们在 Spring 框架源码中的利用。
2 责任链设计模式的个别定义
责任链设计模式是设计模式中的一种行为型设计模式。其根底构造相似于一个链条,整个链条由一个个独自的链环组成,每个链环在程序代码中就是一个独立的处理单元,每个处理单元都有本人负责的独特逻辑,当一个解决申请来到这个链条后,会顺次沿着每个处理单元进行传递直到这个申请被处理完毕为止。
2.1 应用场景:
1. 一个业务申请须要通过一组处理单元的解决。这种场景相似于一个业务逻辑流程中设置了多个性能不同的处理单元,一个业务申请须要通过这多个处理单元的串行解决。
2. 程序中存在能解决同一个申请的多个处理单元,但决定具体应用哪个处理单元须要在程序运行时依据申请动静确定。
2.2 类图构造和 Spring AOP 框架中的利用
1:类图构造
2:责任链设计模式在 Spring AOP 框架中的利用
Spring 框架中的 AOP 模块就应用了责任链设计模式将指标办法的一次调用过程包装成了一条办法调用链来加强指标办法。Spring AOP 模块中包含了 Before、After、AfterReturning、AfterThrowing、Around 这五种告诉办法,Spring AOP 模块将这些告诉办法和指标办法通过动静代理的形式包装成了一条调用链来别离履行各个告诉模块的解决逻辑,上面是 Spring AOP 的源码剖析图。
Spring AOP 通过递归的形式来实现责任链的性能,首先将所有的告诉办法进行排序,而后利用一个 List 索引来管制整个执行流程的开始和完结,在整个责任链中 Before 告诉负责执行前置解决,After 告诉负责执行后置解决,AfterReturning 办法负责在指标办法胜利执行返回后执行解决逻辑,AfterThrowing 办法负责在指标办法异样执行后执行解决逻辑。Spring AOP 将告诉办法包装成办法调用链上的每一个节点,奇妙地利用责任链模式实现了指标办法的解决加强。
3:泛化的责任链设计模式
在日常代码的编写中,责任链设计模式并不需要如此严格的构造,只有代码整体流程由一个个独立的处理单元形成,并且按肯定程序组合组合而成,那么也能够看作是一种更加泛化的责任链设计模式,也能很好的满足开闭准则,例如上面这种更加罕用的代码构造。
下面这种构造同样也能实现责任链解决性能,也能够更加简洁的进行编写,同样能够很好的进批改和灵便扩大,在保护代码的适宜也会更加清晰。
2.3 责任链模式的长处:
1. 每个解决节点都有本人的独特的解决逻辑,明确各自在整个流程中的职责,合乎类的繁多职责准则。
2. 构建的责任链能够依据业务需要进行灵便扭转,能动静进行程序调整以及动静插拔,满足重要的开闭准则。
3. 升高了申请发送者以及申请解决者之间的耦合度。
3 策略设计模式的个别定义
策略设计模式同样也是设计模式中的一种行为型设计模式,其在结构上的体现就是将可变的算法策略局部从业务代码逻辑中独立进去,将这些算法策略造成策略池,从而能够随时替换和更新,使得咱们的代码构造更加灵便、更易扩大。
3.1 应用场景
1:当代码须要依据上下文逻辑来抉择应用不同的业务算法时,咱们能够应用策略设计模式来优化代码的判断构造,从而防止大量的 if/else 分支判断。
2:当代码的主体解决逻辑大致相同,仅仅在局部的业务算法上存在不同时,能够将这些不同的业务算法抽离进去,从而能防止大量反复的代码编写,并能复用主体代码逻辑。
3.2 类图构造和 Spring 框架中的利用
1:类图构造
2:Spring 框架中的利用
Spring 框架中给咱们开发者留下了十分多的扩大策略点,实现了可动静插拔的性能扩大,其中典型的一个策略扩大点就是 BeanPostProcessor 接口,BeanPostProcessor接口容许咱们在 Bean 的初始化前和初始化后做一些逻辑解决策略来扭转 Bean 的属性,容许咱们对 Bean 进行革新和个性化,Spring AOP 就是利用 BeanPostProcessor 这个策略扩大点实现了动静代理 Bean 的创立,上面是 Spring AOP 后置处理器的源码剖析。
Spring AOP 通过导入 AspectJAwareAdvisorAutoProxyCreator 这个实现了 BeanPostProcessor 接口的后置处理器,在 Bean 初始化后进行了一个动静代理类的创立,其在 postProcessAfterInitaliztion 办法中的 WarpIfNecessary 中办法中实现了代理类的创立。Spring 框架利用这种模板加策略的设计模式让咱们能够个性化扩大框架的性能,让框架变得非常灵活可扩大,咱们也能够依据业务需要退出本人的 BeanPostProcessor 策略来实现本人的独特逻辑,很好地满足了重要的开闭设计准则。
3:泛化的策略设计模式
同样地咱们也不用严格依照定义的策略设计模式进行编写,只有在整体上满足业务主体逻辑不变,将变动局部抽离进去,造成能够按需扩大的策略思维就行了,上面以 SpringBoot 主动拆卸的源码来阐明这种更加泛化的策略模式。SpringBoot 主动拆卸机制是依照用户以后的代码运行环境并联合 @Conditional 注解来动静为咱们主动加载须要应用的类,这种策略设计模式是一种更加泛化的策略设计模式,同样满足策略设计模式的按需抉择,动静插拔的设计准则。SpringBoot 的主动拆卸机制的原理如下:
①SpringBoot 在 @EnableAutoConfiguration 注解中应用了 @import 注解导入了
EnableAutoConfigurationImportSelector类。
②利用 EnableAutoConfigurationImportSelector 类的 selectImports 办法来加载 jar 包外面 META-INF/spring.factories 文件中配好的类。
③最初联合各种 @Conditional 注解来实现按需加载的策略设计模式。
SpringBoot 这种按需主动拆卸的策略设计思维,在结构上并不严格合乎策略设计模式的构造,但他的整体设计思维十分合乎策略设计模式,咱们在我的项目中也能够通过配置文件的形式来灵便切换咱们代码中应用的策略算法。
3.3 策略设计模式的长处:
1:能够在程序运行时动静抉择切换须要应用的独立业务算法。
2:将可变的业务算法与业务主体逻辑剥离,实现更加灵便的保护和扩大。
3:满足开闭准则,无需批改原有的代码逻辑就能实现不同业务算法灵便切换。
4 联合策略设计模式和责任链设计模式
将策略设计模式和责任链设计模式进行联合就能造成灵便可扩大的流程构造,能应答多变的业务需要,上面是将两者进行联合的结构图。
一个 request 在通过每一个 handler 处理单元时,会依据 request 的上下文内容抉择适合的策略进行解决,而后将这所有的 handler 串联起来造成残缺的业务流程。
5 总结
在日常代码的编写中,业务需要的变动总是不定的,这样会导致咱们的代码会频繁的随着需要的扭转进行调整,稍加不留神的话就会导致咱们的代码十分臃肿和简单,累加到肯定水平后会变得难以保护,这时事后应用适合的代码设计模式能无效的缓解这种状况,文中形容的责任链和策略设计模式能无效满足代码编写的开闭准则,能更加无效的应答随时变动的业务需要。