设计模式: 一个简单的策略模式demo

在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;
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值