前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >公司系统if-else语句太多了,我用设计模式消除了if-else

公司系统if-else语句太多了,我用设计模式消除了if-else

作者头像
Lvshen
发布于 2022-05-05 10:53:11
发布于 2022-05-05 10:53:11
55200
代码可运行
举报
运行总次数:0
代码可运行

我在之前的文章中使用枚举消除了if-else语句

这次我采用其他方式消除if-else。

背景

你在平时开发中肯定有使用if-else语句的时候,然而大量的if-else语句不利于代码阅读,影响代码复杂度。反正我在消除Sonar异味的时候头疼过。

之前公司系统的代码中也存在if-else过多问题,导致代码不优雅,这里为了讲解,我将业务逻辑简化。

假如我有一个计算实际价格的方法,要求输入用户的级别和商品的实际价格,返回商品的真实价格,代码如下:

这里level就是用户的级别,originalPrice就是商品的原始价格。如果用户级别为"normal",返回的真实价格为原始价格乘以1.0。如果用户级别为"vip",返回的真实价格为原始价格乘以0.9。否则返回原始价格。

测试代码如下:

结果"vip"的价格为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getActualPrice()测试的真实价格为:90.0

上面的代码你可能看着没毛病,但是用户的等级可能还有超级vip(svip),还可能有ssvip。还可能更多,那么这个方法if-else将会非常多。并且会经常修改这个方法,违背了设计原则中的开闭原则。为此,我思考能不能不修改这个方法也能实现level级别的扩展呢。

使用设计模式消除if-else

想来想去,我决定使用设计模式来消除if-else。

CalculateStrategy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface CalculateStrategy {
    String userLevel();
    BigDecimal discount(BigDecimal originalPrice);
}

这里先写一个计算的接口,定义了两个方法:获取用户等级,和相应价格计算的方法。

NormalStrategy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class NormalStrategy implements CalculateStrategy {
    @Override
    public String userLevel() {
        return "normal";
    }

    @Override
    public BigDecimal discount(BigDecimal originalPrice) {
        return originalPrice.multiply(new BigDecimal("1.0"));
    }
}

normal级别的实现类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class VipStrategy implements CalculateStrategy {
    @Override
    public String userLevel() {
        return "vip";
    }

    @Override
    public BigDecimal discount(BigDecimal originalPrice) {
        return originalPrice.multiply(new BigDecimal("0.9"));
    }
}

vip级别的实现类。

我们计算真实价格的代码如下:

这里我创建了一个map,map的key存放用户级别level,value存放CalculateStrategy的对象。当系统启动时,IoC容器会给SaleService创建对象,这时map会存入所有实现了CalculateStrategy的对象。

然后编写一个getActualPriceWithStrategy()方法,用于根据用户级别计算商品实际价格。如果增加用户级别,只需要增加相应的类,如:SvipStrategySSvipStrategy等。这样 就不用修改getActualPriceWithStrategy()中的内容了,保证了这个方法的安全性。

测试代码如下:

测试结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getActualPriceWithStrategy()测试的真实价格为:90.0

其实上面我有使用到了设计模式中的策略模式,我将if-else中算法抽取出来,单独封装到了类中,这样使算法独立于调用者,如果改变算法也只需要改变算法类,不需要改变调用者。

当然只是用策略模式还不能消除if-else,大家可以思考下:

“上述代码还有用到其他设计模式么?”

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lvshen的技术小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 使用设计模式消除if-else
    • CalculateStrategy
    • NormalStrategy
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档