浅谈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代码逻辑冗长,难以维护的问题,提高可扩展性。

经验分享 程序员 微信小程序 职场和发展