策略模式

首先有一个收银台小程序:

商场会有促销活动,包括打折,买200减100,买500送积分之类的很多
那么就会用到很多的if else 判断。

那么如何消除if else 判断呢?
可能有人想到了使用简单工厂模式。是的,这样确实能够解决if 判断。但是如果后期的更改,我们是不是就要修改工厂类呢?岂不是很麻烦?

1
2
3
CashSuper csuper = CashFactory.createCashAccept(......
csuper.getResult(......

如果使用策略模式呢?
首先我们定义一个父类现金收费抽象类,让各种促销类继承他,然后创建一个Context类,在这个类中维护一个Strategy的引用。并且创建一个参数为Strategy类型的构造方法,然后创建一个方法,根据具体的Strategy对象执行对应的方法。

这样,我们在客户端的代码就是这样的了

1
2
3
CashContext csuper = new CashContext(......
csuper.getResult(......

这段代码和工厂模式的代码的区别就是,客户端只看到了一个类,而工厂模式看到了两个类,也就是说,代码的耦合度降低了。
实际上我们只是在工厂类中维护了一个Strategy引用,并添加了一个根据策略引用执行特定的方法。然后改一下名字,就变成了策略模式。

那么我们有没有解决最初的工厂中if else过多导致的后期扩展的维护难题呢?没有。
我们只是在工厂模式的基础上,学习了另一种设计模式:策略模式,这个在简化一些if else中还是有作用的,在客户端最起码没有了大量的if 判断,减少了代码的坏味道。

总的来说,策略模式封装了变化,也就是封装了算法。应用场景就是大量的if判断,请一定使用策略模式,否则代码以后的维护就是个大问题。
使用策略简单工厂模式就能大大的优化代码,让代码具有可复用,易于维护,可扩展,灵活性高。耦合度低。


策略模式
http://thinkinjava.cn/2017/10/27/2017/2017-10-27-策略模式/
作者
莫那·鲁道
发布于
2017年10月27日
许可协议