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

这里的返回值为项目里面自定义的通用返回值,可自行修改
- 策略上下文: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);
}
}
- 策略接口
/**
* 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. 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;
}
}
- 调用策略方式
/**
* 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);
}
}
运行结果

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

2万+

被折叠的 条评论
为什么被折叠?



