面向对象——策略模式

问题

某个超市的商品正在促销,有的打折,有的满减,每一个都不一样
怎样可以使写出来的代码量减少

分析

第一种方式:

  1. 每一种打折的商品都是一类
  2. 使用类对促销策略相同的进行封装

这样做确实是把功能实现了,但是有点不太好,如果商品种类特别多,每个商品还有不同的性质,比如说储存条件之类的,需要在一个类的里面到处找,可能有时候找半天才找到,也有可能修改之后还会出现一堆问题

第二种方式:

  1. 将计算促销的部分专门封装成一个类
  2. 每个商品对应一个促销类型,直接继承就是了

第二种方式在对商品进行修改的时候,确实比第一种要方便得多,但是出现问题的时候,又要将每一个促销类都重新写一次,可能过了今天我的促销就结束了,难道我要把整个促销类都清空吗?

那怎么办呢?

使用策略模式

什么是策略模式?

策略模式是专门针对算法而使用的模式

像前面提到的,打折,满减,都属于促销算法,打 n 折,满 a 减 b,这里面三个都是未知数,商家会随时更改,每个商品的促销力度都不一样

怎么使用?

在 C++ 中使用虚函数,纯虚函数和抽象类

在 Java 中使用抽象类和接口

C++:

  1. 将打折和满减两个不同的促销模式写成抽象类
  2. 将,打 n 折,满 a 减 b,这些写成纯虚函数
  3. 让某个类(折扣类)继承这个抽象类,并且实现这两个函数,实现为不进行促销的情况
  4. 其他商品继承折扣类,并且重写父类函数(多态)

Java:

  1. 将打折和满减两个不同的促销模式写成接口
  2. 抽象类实现这个接口
  3. 子类继承抽象类之后重写父类方法(多态)

还有的代价

尽管现在好像已经减轻了很多的工作量,但是在修改的时候好像还是挺麻烦的,没办法,总不可能没有成本,能尽可能的将维护的成本降到最低已经挺好的了

总结

策略模式可以将各类算法中的相同部分封装成一个类,抽取相同的部分,使抽象程度更高,减少对单个算法的维护工作量
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值