浅谈Spring框架应用的设计模式(六)——策略模式
前言
Spring是目前Java企业级开发应用广泛的框架之一,其具有强大的生态,且得益于其提供的高扩展能力,能够减少开发成本,提高开发效率。如此优秀的框架,当然离不开各种设计模式,本文主要介绍设计模式中的策略模式在Spring框架中的应用。
一、策略模式介绍
策略模式属于三种设计模式分类中的** 行为型模式**,其能够让一个类的行为可以随着运行时的选择的策略去动态改变,我们可以通过一个策略接口,去实现不同的策略,并创建一个行为随着策略实现的改变而改变的 context 对象,策略对象能够改变 context 对象的执行算法,从而实现不同的策略行为的执行。策略模式常常用于替代冗长且难以维护的的if…else逻辑,使用策略模式,可以将不同的算法实现进行封装,提高扩展性,实现分支等策略的自由灵活切换。
//策略接口 public interface Strategy { public int operate(int num1, int num2); } //加法策略实现 public class OperationAdd implements Strategy{ @Override public int operate(int num1, int num2) { return num1 + num2; } } //乘法策略实现 public class OperationMultiply implements Strategy{ @Override public int operate(int num1, int num2) { return num1 * num2; } } //策略的选择,根据传入的strategy,执行不同的策略算法 public class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public int executeStrategy(int num1, int num2){ //根据传入的不同strategy实现完成不同的算法 return strategy.operate(num1, num2); } }
通过实现operate方法完成不同Strategy接口的实现类,从而生成不同的策略算法,可以根据不同需求,将实现的策略对象传入context中,利用多态的形式来选择不同的策略。在实际开发中,其常常会代替复杂的分支逻辑,使代码的维护性更高。
二、Spring框架中策略模式的应用 InstantiationStrategy
在Spring框架中我们可以知道Spring管理的Bean对象是从BeanDefinition(Bean定义信息来的),因此Spring Bean对象创建和实例化会运用到的反射等各种方法,当然Spring底层运用到了策略模式来进行Bean对象的实例化。Spring框架提供了一个InstantiationStrategy实例化策略接口,其中有两个实现,分别是SimpleInstantiationStrategy以及CglibSubclassingInstantiationStrategy。
//InstantiationStrategy实例化策略接口,有三个instantiate重载方法 public interface InstantiationStrategy { Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) throws BeansException; Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, Constructor<?> ctor, Object... args) throws BeansException; Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, @Nullable Object factoryBean, Method factoryMethod, Object... args) throws BeansException; }
可以看到InstantiationStrategy接口的实现类实际上有两个分别是SimpleInstantiationStrategy以及CglibSubclassingInstantiationStrategy,其中CglibSubclassingInstantiationStrategy还继承了SimpleInstantiationStrategy。 AbstractAutowireCapableBeanFactory中会去实例化bean对象,在autowire方法中,其会获取当前factory中的InstantiationStrategy接口实现类,并调用instantiate方法来完成实例化,此时,便可以根据factory中不同的实现类完成不同的实例化策略,从而提高可扩展性。
总结
本文主要介绍策略模式的实现以及其在Spring框架中的应用。策略模式是一种行为模式,利用面向对象的多态特性,将不同策略通过相同接口的不同实现来完成,其可以有效用于解决if…else代码逻辑冗长,难以维护的问题,提高可扩展性。