if-else语句太多了?我用设计模式消除了if-else
我在之前的文章中使用枚举消除了if-else语句 , 有兴趣的可以看看我的这篇文章:
“
如何用枚举消除if/else?-枚举高阶用法
”
这次我采用其他方式消除if-else 。
背景你在平时开发中肯定有使用if-else语句的时候 , 然而大量的if-else语句不利于代码阅读 , 影响代码复杂度 。 反正我在消除Sonar异味的时候头疼过 。
之前公司系统的代码中也存在if-else过多问题 , 导致代码不优雅 , 这里为了讲解 , 我将业务逻辑简化 。
假如我有一个计算实际价格的方法 , 要求输入用户的级别和商品的实际价格 , 返回商品的真实价格 , 代码如下:
文章插图
这里level就是用户的级别 , originalPrice就是商品的原始价格 。 如果用户级别为"normal" , 返回的真实价格为原始价格乘以1.0 。 如果用户级别为"vip" , 返回的真实价格为原始价格乘以0.9 。 否则返回原始价格 。
测试代码如下:
文章插图
结果"vip"的价格为:
getActualPrice()测试的真实价格为:90.0
上面的代码你可能看着没毛病 , 但是用户的等级可能还有超级vip(svip) , 还可能有ssvip 。 还可能更多 , 那么这个方法if-else将会非常多 。 并且会经常修改这个方法 , 违背了设计原则中的开闭原则 。 为此 , 我思考能不能不修改这个方法也能实现level级别的扩展呢 。
文章插图
使用设计模式消除if-else想来想去 , 我决定使用设计模式来消除if-else 。
CalculateStrategypublic interface CalculateStrategy {String userLevel();BigDecimal discount(BigDecimal originalPrice);}
这里先写一个计算的接口 , 定义了两个方法:获取用户等级 , 和相应价格计算的方法 。
NormalStrategy@Componentpublic class NormalStrategy implements CalculateStrategy {@Overridepublic String userLevel() {return "normal";}@Overridepublic BigDecimal discount(BigDecimal originalPrice) {return originalPrice.multiply(new BigDecimal("1.0"));}}
normal级别的实现类 。
@Componentpublic class VipStrategy implements CalculateStrategy {@Overridepublic String userLevel() {return "vip";}@Overridepublic BigDecimal discount(BigDecimal originalPrice) {return originalPrice.multiply(new BigDecimal("0.9"));}}
vip级别的实现类 。
我们计算真实价格的代码如下:
文章插图
这里我创建了一个map , map的key存放用户级别level , value存放CalculateStrategy的对象 。 当系统启动时 , IoC容器会给SaleService创建对象 , 这时map会存入所有实现了CalculateStrategy的对象 。
文章插图
然后编写一个getActualPriceWithStrategy()方法 , 用于根据用户级别计算商品实际价格 。 如果增加用户级别 , 只需要增加相应的类 , 如:SvipStrategy、SSvipStrategy等 。 这样 就不用修改getActualPriceWithStrategy()中的内容了 , 保证了这个方法的安全性 。
测试代码如下:
文章插图
- 腾讯|蚂蚁员工人人喜提283平米大房子?你想多了
- 展会上,这个品牌展台上面展出的锂电车款太多了
- 披甲来战!光威纯国产中国芯马甲条上市,洋内存又多了一个对手
- 为什么三大运营商,都要进行免费升级5G?网友:套路太多了
- iPhone|网上买手机和实体店买手机有差别吗?店老板吐槽:差太多了!
- 京东数科|你pick谁?,比柜姐能干多了!各国银行AI助理大PK
- iPhone|目前烂大街的3部手机,使用的人太多了,走几步就能看见
- iphone12|iPhone12ProMax和华为P40Pro+拍照对比:差距比想象的大多了
- 银行|马云退休1年多了,他曾花“天价”打造的蚂蚁森林,如今咋样了?
- 小米科技|iPhone12Pro/一加8T/小米10至尊版拍照对比:差距比想象的大多了