我曾在我的技术文章中采用枚举的方式消解了if-else的冗余,对这有兴趣的朋友可以参考我之前的分享:
《如何用枚举消除if/else? - 枚举的高阶应用》
而今,我尝试着以另一种方式来处理if-else的困扰。
背景
在软件开发过程中,我们常常会遇到需要使用if-else语句的情况。过多的if-else语句不仅不利于代码的可读性,还会增加代码的复杂度。我曾经在处理Sonar代码异味时遇到过这样的问题。
在之前的工作中,我遇到公司系统的代码中if-else泛滥的情况,这使代码显得不够优雅。为了更好地解释这个问题,我将简化业务逻辑。
假设有一个计算商品实际价格的方法,需要输入用户的级别和商品的原价,然后返回商品的真实价格。以下是该方法的基本实现:
这里的level代表用户级别,originalPrice则是商品的原价。如果用户是普通用户(normal),真实价格就是原价乘以1.0;如果是用户,真实价格则是原价乘以0.9;否则,就返回原价。
下面是简单的测试代码示例:
测试结果中的价格显示为:
使用设计模式解决if-else的弊端
经过思考,我决定采用设计模式来解决if-else的问题。
CalculateStrategy 接口
我们定义一个计算接口,包括获取用户等级和计算相应价格的方法。
NormalStrategy 和 VipStrategy 类的实现
然后我们分别为normal级别和vip级别创建实现类。
我们的真实价格计算代码如下:
我们创建了一个映射(map),其键存放用户级别level,值存放CalculateStrategy的对象实例。在系统启动时,IoC容器将为SaleService创建对象,这时map将存入所有实现了CalculateStrategy的对象。
测试代码示例
测试结果:
实际上,我在这里运用了设计模式中的策略模式。我将if-else中的算法提取出来,单独封装在类中。这样使算法独立于调用者,如果需要改变算法只需改变算法类,无需改变调用者。
是否还有其他设计模式被应用在上述代码中?请思考并回答。