SpringBoot策略模式实现

文章介绍了如何在SpringBoot应用中利用策略模式来处理多种条件分支,通过创建策略接口和不同的实现类,以及一个策略上下文类来动态选择执行策略,从而避免过多的if判断。示例中展示了策略上下文的构造注入、策略接口定义、策略实现类以及测试调用方法。

SpringBoot策略模式实现

当 if 判断过多或者同一个接口需要处理不同场景时,可以通过策略模式可以让代码更加简洁易懂

代码目录结构

在这里插入图片描述
这里的返回值为项目里面自定义的通用返回值,可自行修改

  1. 策略上下文:StrategyContext
/**
 * ClassName: StrategyContext
 *
 * @author chenwx
 * @Description: 策略上下文
 * @date 2022-12-21 10:38
 */
@Component
public class StrategyContext {

    private static final Logger log = LoggerFactory.getLogger(StrategyContext.class);

    private final Map<String, IStrategy> iStrategyMap;

    /**
     * spring 使用spring容器构造注入
     * @param iStrategyMap      策略提供者
     */
    public StrategyContext(Map<String, IStrategy> iStrategyMap) {
        this.iStrategyMap = iStrategyMap;
    }

    /**
     * 策略
     * @param strategyId    策略id
     * @param param1        参数1
     * @param param2        参数2
     * @param param3        参数3
     * @return
     */
    public BaseResponse<Map<String, Object>> doStrategy(String strategyId, String param1, String param2, String param3){
        IStrategy iPointsPayStrategy = this.iStrategyMap.get(strategyId);
        //策略非空出路,防止任务策略id填错/乱填
        if(null == iPointsPayStrategy){
            log.info("策略id为空,strategyId:{}",strategyId);
            return new BaseResponse<>(R.SYSTEM_IS_BUSY.getRetCode(), "策略id为空");
        }
        return iPointsPayStrategy.doStrategy(param1,param2,param3);
    }

}

  1. 策略接口
/**
 * ClassName: IStrategy
 *
 * @author chenwx
 * @Description: 策略接口
 * @date 2022-12-21 10:40
 */
public interface IStrategy {

    /**
     * 策略接口
     * @param param1    参数1
     * @param param2    参数2
     * @param param3    参数3
     * @return
     */
    BaseResponse<Map<String, Object>> doStrategy(String param1, String param2, String param3);

}

  1. 策略实现类(这里只写一个)
/**
 1. ClassName: CommonStrategy
 2.  3. @author chenwx
 4. @Description: 策略实现类
 5. @date 2022-12-21 10:45
 */
@Component
public class CommonStrategy implements IStrategy{


    @Override
    public BaseResponse<Map<String, Object>> doStrategy(String param1, String param2, String param3) {
    	// 策略的具体代码实现
        System.out.println("公共策略处理");
        System.out.println(param1);
        System.out.println(param2);
        System.out.println(param3);
        return null;
    }
}
  1. 调用策略方式
/**
 * ClassName: StrategyTest
 *
 * @author chenwx
 * @Description: 调用方式
 * @date 2022-11-29 16:31
 */
@RunWith(SpringRunner.class)
@SpringBootTest()
public class StrategyTest {

    public static final HashMap<String,String> STRATEGY_ID = new HashMap<>();

    @Resource
    public StrategyContext strategyContext;

    static {
        // 策略1
        STRATEGY_ID.put("1","strategy1");
        // 策略2
        STRATEGY_ID.put("2","strategy2");
        // 通用策略
        STRATEGY_ID.put("common","commonStrategy");
    }

    /**
     * 查询打卡记录
     */
    @Test
    public void Test(){
        String param1 = "param1";
        String param2 = "param2";
        String param3 = "param3";
        strategyContext.doStrategy(STRATEGY_ID.get("1"),param1,param2,param3);
        strategyContext.doStrategy(STRATEGY_ID.get("common"),param1,param2,param3);

    }

}

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值