SpringBoot中使用策略模式解决if-else 的频繁判断

SpringBoot中使用策略模式 解决 if-else 问题

在某些场景中需要进行频繁的if-else 判断,会显的代码特别冗余,而且多重的if-else维护起来也很不容易,因此采用策略模式解决。
(以购买商品为例,普通会员原价购买,超级会员8折,下文为在springboot中通过策略模式的实现方法)

1.定义一个策略类接口,定义公共方法
/**
 * @Author: daiguojun
 * @CreateDate: 2021/4/12 17:52
 * @Description: 策略模式接口定义
 * (以购买商品为例,普通会员原价购买,超级会员8折)
 */
@Component
public interface TestStrategy {

    //输入商品价格,返回需要支付价格
    Integer getPrice(Integer price);

}
2.定义实现类
/**
 * @Author: daiguojun
 * @CreateDate: 2021/4/12 17:57
 * @Description: 普通会员
 * 以注解的形式将实现类对象注入到spring容器中
 */
@Component
public class OrdinaryMember implements TestStrategy {

    @Override
    public double getPrice(double price) {
        return price;
    }
}

/**
 * @Author: daiguojun
 * @CreateDate: 2021/4/12 17:58
 * @Description: 超级会员
 */
@Component
public class SuperMember implements TestStrategy {
    @Override
    public double getPrice(double price) {
        return price*0.8;
    }
}
3.通过注解的形式将类名注入到map中

(接口的实现类需要加注解,否则无法将接口实现类对象注入到map集合中)

/**
 * @Author: daiguojun
 * @CreateDate: 2021/4/12 18:03
 * @Description: 将实现类对象注入到map集合中
 */
@Component
@Slf4j
public class StrategyInfo {

    private final Map<String, TestStrategy> map = new HashMap<>();

    /**
     * 将接口的实现类注入到map中,key为类名(首字母小写),value为实现类对象
     * @param map
     */
    @Autowired
    public void setStrategyMap(Map<String, TestStrategy> map) {
        this.map.clear();
        map.forEach(this.map::put);
    }


    /**
     *  通过该方法获取实现类
     * @param mode
     * @return
     */
    public TestStrategy getObjectInfo(String str) {
        if(str.isEmpty()){
            log.info("输入字符串为空!");
            return null;
        }
        return this.map.get(str);
    }
}
4.测试

策略模式的实现

/**
 * @Author: daiguojun
 * @CreateDate: 2021/4/12 18:16
 */
@SpringBootTest
@RunWith(SpringRunner.class)
public class test {

    @Autowired
    private StrategyInfo strategyInfo;

    @Test
    public void test(){
        Double price = 100.0;
        TestStrategy ordinaryMember = strategyInfo.getObjectInfo("ordinaryMember");
        System.out.println("普通会员售价:"+ordinaryMember.getPrice(price));

        TestStrategy superMember = strategyInfo.getObjectInfo("superMember");
        System.out.println("超级会员售价:"+superMember.getPrice(price));

    }
}
5.总结

​ 传递参数不同,调用接口的实现类不同,进而执行不同的操作。解决了频繁进行if-else 判断的问题,有效的提高代码质量。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对你偏爱u

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值