问题
某个超市的商品正在促销,有的打折,有的满减,每一个都不一样
怎样可以使写出来的代码量减少
分析
第一种方式:
- 每一种打折的商品都是一类
- 使用类对促销策略相同的进行封装
这样做确实是把功能实现了,但是有点不太好,如果商品种类特别多,每个商品还有不同的性质,比如说储存条件之类的,需要在一个类的里面到处找,可能有时候找半天才找到,也有可能修改之后还会出现一堆问题
第二种方式:
- 将计算促销的部分专门封装成一个类
- 每个商品对应一个促销类型,直接继承就是了
第二种方式在对商品进行修改的时候,确实比第一种要方便得多,但是出现问题的时候,又要将每一个促销类都重新写一次,可能过了今天我的促销就结束了,难道我要把整个促销类都清空吗?
那怎么办呢?
使用策略模式
什么是策略模式?
策略模式是专门针对算法而使用的模式
像前面提到的,打折,满减,都属于促销算法,打 n 折,满 a 减 b,这里面三个都是未知数,商家会随时更改,每个商品的促销力度都不一样
怎么使用?
在 C++ 中使用虚函数,纯虚函数和抽象类
在 Java 中使用抽象类和接口
C++:
- 将打折和满减两个不同的促销模式写成抽象类
- 将,打 n 折,满 a 减 b,这些写成纯虚函数
- 让某个类(折扣类)继承这个抽象类,并且实现这两个函数,实现为不进行促销的情况
- 其他商品继承折扣类,并且重写父类函数(多态)
Java:
- 将打折和满减两个不同的促销模式写成接口
- 抽象类实现这个接口
- 子类继承抽象类之后重写父类方法(多态)
还有的代价
尽管现在好像已经减轻了很多的工作量,但是在修改的时候好像还是挺麻烦的,没办法,总不可能没有成本,能尽可能的将维护的成本降到最低已经挺好的了
总结
策略模式可以将各类算法中的相同部分封装成一个类,抽取相同的部分,使抽象程度更高,减少对单个算法的维护工作量