在我们得代码中,经常会有遇到有多个ifelse挤在一起得情况,如果这些代码不是非常长,并且不经常改变得话,那看起来也没有什么问题,但是,在实际情况中,我们得代码经常是需要扩展得,因为我们得需求在不断增加,那么如果每增加一种需求,我们就要多加一个else嘛?
当然不是的,如果这样实现,会使得代码难以阅读,耦合性增加,它也违背我们的程序设计原则之一,开放关闭原则,即对扩展开发,对修改关闭.
举例:
这里以电商中价格计算为场景切入,在价格计算中,我们通常需要根据不同用户去计算不同的价格,比如说vip(普通vip)–打九折优惠,svip(超级vip)–打八折优惠,normal(普通用户)–原价卖出.
所以我们的代码可能是这样的.
在实际中,这可能是一个非常冗余的代码,可能篇幅很大,我们需要对其进行改变,不然以后可能需求增加,我们在原有代码上进行修改,牵一发而动全身.怎么改? 策略模式
我新建了一个接口,里面有一个discount方法,
新建了三个实体类去继承该接口,并实现discount方法,getUserType方法,关系如下图所示.
这样,我们上面的代码就可以变成以下几行,把各自的实现策略封装到了类中,不用在一个方法中堆积几百行的业务逻辑代码,如下图所示.
此时,我们将程序进行了简化,使代码变得易读,但是,我们其实还没有替换掉ifelse,还是需要进行判断,那么接下来应该怎么做呢?
我们可以从Spring中得到启发,在我们使用Spring中,我们需要生成好多bean,然后在使用的时候注入进来,那么Spring是怎么做到的呢?它是靠ifelse判断的嘛?不是的,它是靠一个map来实现的,将所有的bean放入map中,需要的时候取出来即可.我们这里也参照实现
如上代码所示,我们将所有的类对象放入到了一个map中,userType作为key,Object作为value,在需要的时候根据参数将对象取出,调用对应的方法即可.这样就实现了代替多个ifelse的效果,而且以后当增加需求时,我们只需新建一个类实现CulculateStrategy接口即可,关键代码则不需要改变.满足了程序的设计原则.