网站首页 > 基础教程 正文
我在之前的文章中使用枚举消除了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。
CalculateStrategy
public interface CalculateStrategy {
String userLevel();
BigDecimal discount(BigDecimal originalPrice);
}
这里先写一个计算的接口,定义了两个方法:获取用户等级,和相应价格计算的方法。
NormalStrategy
@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级别的实现类。
@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()方法,用于根据用户级别计算商品实际价格。如果增加用户级别,只需要增加相应的类,如:SvipStrategy、SSvipStrategy等。这样 就不用修改getActualPriceWithStrategy()中的内容了,保证了这个方法的安全性。
测试代码如下:
测试结果:
getActualPriceWithStrategy()测试的真实价格为:90.0
其实上面我有使用到了设计模式中的策略模式,我将if-else中算法抽取出来,单独封装到了类中,这样使算法独立于调用者,如果改变算法也只需要改变算法类,不需要改变调用者。
当然只是用策略模式还不能消除if-else,大家可以思考下:
“
上述代码还有用到其他设计模式么?
”
- 上一篇: CSS,我可以写 if/else 语法了?
- 下一篇: C++——if-else 语句
猜你喜欢
- 2024-11-20 一文搞懂Golang条件判断:if-else语句详解
- 2024-11-20 无需If-Else语句,状态模式即可编写干净可维护的代码
- 2024-11-20 答应我,别再if/else走天下了可以吗
- 2024-11-20 如何对SpringBoot中的IF-ELSE语句进行优化?
- 2024-11-20 道哥说编程--Java流程控制语句if--else详解
- 2024-11-20 if-elif-else,三目运算符,while条件循环,for迭代循环
- 2024-11-20 设计模式:策略模式避免多重分支语句(ifelse)
- 2024-11-20 Excel VBA流程图解之IF语句,多层IF嵌套,其实很简单
- 2024-11-20 4.2 练习编写简单的if语句和else语句
- 2024-11-20 C/C++编程笔记:if—else语句块,有个细节需要注意
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- deletesql (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)