在Springboot项目中使用策略模式实现加减乘除
参考链接:设计模式-策略者模式
- 定义一个策略接口IStrategy
- 多个IStrategy接口的实现类
- 策略处理类ExecuteContext
- 通过ExecuteContext获取bean去调用具体方法(入参是IStrategy接口的实现类)
定义一个接口IStrategy
public interface IStrategy<T> extends InitializingBean {
int run(int num1, int num2);
OperatorTypeEnum supportedOperatorType();
@Override
default void afterPropertiesSet() throws Exception {
ExecuteContext.addExecuteStrategy(supportedOperatorType(), this);
}
}
多个IStrategy接口的实现类
枚举
public enum OperatorTypeEnum {
ADD,SUB,MUL,DIV;
}
@Component
public class AddStrategy implements IStrategy<AddStrategy>{
@Override
public int run(int num1, int num2) {
return num1 + num2;
}
@Override
public OperatorTypeEnum supportedOperatorType() {
return OperatorTypeEnum.ADD;
}
}
@Component
public class SubStrategy implements IStrategy<SubStrategy> {
@Override
public int run(int num1, int num2) {
return num1 - num2;
}
@Override
public OperatorTypeEnum supportedOperatorType() {
return OperatorTypeEnum.SUB;
}
}
@Component
public class MulStrategy implements IStrategy<MulStrategy> {
@Override
public int run(int num1, int num2) {
return num1 * num2;
}
@Override
public OperatorTypeEnum supportedOperatorType() {
return OperatorTypeEnum.MUL;
}
}
@Component
public class DivStrategy implements IStrategy<DivStrategy> {
@Override
public int run(int num1, int num2) {
return num1 * num2;
}
@Override
public OperatorTypeEnum supportedOperatorType() {
return OperatorTypeEnum.DIV;
}
}
策略处理类ExecuteContext
@Component
public class ExecuteContext {
private static EnumMap<OperatorTypeEnum, IStrategy<?>> strategyMap = new EnumMap<>(OperatorTypeEnum.class);
public static void addExecuteStrategy(OperatorTypeEnum operatorType, IStrategy<?> strategy) {
strategyMap.put(operatorType, strategy);
}
public static Integer executeStrategy(OperatorTypeEnum operatorType, int num1, int num2) {
IStrategy<?> strategy = strategyMap.get(operatorType);
if (strategy != null) {
return strategy.run(num1, num2);
}
return null;
}
}
controller实现
@GetMapping("/demo/designTest")
Integer designTest(@RequestParam(value = "operatorType") OperatorTypeEnum operatorType,
@RequestParam(value = "num1") int num1 ,
@RequestParam(value = "num2") int num2);
@Override
public Integer designTest(OperatorTypeEnum operatorType, int num1, int num2) {
log.info("operatorType: {}, num1: {}, num2: {}", operatorType, num1, num2);
Integer result = executeContext.executeStrategy(operatorType, num1, num2);
log.info("result: {}", result);
return result;
}