设计模式: 基于spring源码、实际业务理解策略模式

在Spring框架中,策略模式被广泛应用于不同的模块和组件中,以提高代码的灵活性和可扩展性。策略模式的核心思想是定义一系列算法,将每个算法都封装起来,并使它们可以互换。在Spring中,这种模式通常通过定义一个策略接口和多个具体策略实现类来实现。以下结合源码分析Spring中策略模式的应用。

InstantiationStrategy 接口及其实现

在Spring的Bean生命周期管理中,InstantiationStrategy接口扮演着重要角色。它定义了创建bean实例的策略。SimpleInstantiationStrategyInstantiationStrategy的一个具体实现,负责处理普通的bean实例化过程。当遇到需要通过CGLIB代理来创建bean实例时,

CglibSubclassingInstantiationStrategy类会覆盖SimpleInstantiationStrategy中的某些方法,以实现对bean的代理。

public interface InstantiationStrategy {
// 基于无参构造函数创建bean实例
Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) throws BeansException;
// 基于指定构造函数创建bean实例
Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, Constructor<?> ctor, Object... args) throws BeansException;
// 基于工厂方法创建bean实例
Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, @Nullable Object factoryBean, Method factoryMethod, Object... args) throws BeansException;
}

策略模式解决if-else问题

在业务开发中,if-else语句的使用往往会导致代码难以维护。策略模式通过将算法封装成一系列的策略类,允许在运行时动态选择使用哪个策略,从而避免了复杂的条件判断。例如,在商场促销策略中,可以定义不同的促销策略类,如打折、满减等,并通过上下文对象动态选择使用哪种策略。

SpringMVC中的策略模式

在SpringMVC中,策略模式同样被用于处理不同的请求。例如,LayoutManager就是一个策略接口,它定义了视图布局的方式。具体的布局管理器实现类,如BorderLayoutFlowLayout等,都是LayoutManager接口的具体策略实现。

如何在Spring环境下实现策略模式

在Spring环境下,实现策略模式可以通过定义一个策略接口和多个实现类,然后利用Spring的依赖注入机制来管理这些策略。例如,可以定义一个IGroupSelect接口和多个实现类,如EsGroupSelectFileGroupSelectMongoGroupSelect等。通过一个工厂类GroupSelectFactory,可以根据条件动态地选择使用哪个策略实现。

public interface IGroupSelect {
// 人群获取方式
GroupType type();
// 查询满足条件的用户
List<GroupUser> queryUser(GroupQuery groupQuery);
// 事前校验查询条件
void checkQueryCondition(GroupQuery groupQuery) throws IllegalArgumentException;
// 真正的查询方法
List<GroupUser> doQuery(GroupQuery groupQuery);
}
结合工厂模式使用策略模式
在某些情况下,策略模式可以与工厂模式结合使用,以提供更加灵活的策略选择机制。例如,可以定义一个StrategyFactory工厂类,它管理着所有可用的策略实现,并提供一个方法来根据策略名称获取对应的策略实例。这种方式可以进一步简化策略的选择过程,并使得代码更加清晰。
支付场景使用使用策略模式案例

在用户提交订单后,用户可以选择支付宝,微信等其他支付渠道,关于支付渠道可以使用工厂模式加策略模式来实现。

代码实现:

package com.pay;
​
//支付渠道
public class PayConstants {
​
//支付宝
public static final int ZFB = 1;
​
//微信
public static final int WX = 2;
}

定义支付工厂

package com.pay;
​
public interface PayFactory {
​
void pay();
}
​

支付工厂具体实现类

package com.pay;
​
public class WxPay implements PayFactory{
​
@Override
public void pay() {
// TODO Auto-generated method stub
    System.out.println("微信支付");
  }
​
}
​
package com.pay;
​
public class ZfbPay implements PayFactory{
​
@Override
public void pay() {
// TODO Auto-generated method stub
    System.out.println("支付宝支付");
  }
​
}
​

策略工厂

package com.pay;
​
import java.util.HashMap;
import java.util.Map;
​
public class StrategyFactory {
​
  public static Map<Integer, PayFactory> strategyMap = new HashMap<>();
  
    static {
      strategyMap.put(PayConstants.WX,new WxPay());
      strategyMap.put(PayConstants.ZFB,new ZfbPay());
    }
  
}

测试类

package com.pay;
​
public class Test {
​
public static void main(String []args) {
​
    StrategyFactory.strategyMap.get(PayConstants.WX).pay(); 
    StrategyFactory.strategyMap.get(PayConstants.ZFB).pay(); 
  }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值