商城优惠券会员卡系列(二)
文章目录
- 前言
- 对策
- 策略模式
- 总结
前言
接上文继续 ,这时候产品又来了一个新需求(PS:这是一个假需求,自己遐想的)。
我们来了新出一个需求:需要优惠券里面添加一个功能,优惠券新出折扣优惠券,可以打折。我去!!!这不是会员卡的功能吗?要不把会员卡的内容COPY一份
对策
拷贝一份好像马上就解决了问题。但是接下来同一份逻辑就要维护两份了。那有什么方法可以把计算方法抽离出来然后公用呢。
策略模式好像解决该问题。
策略模式
策略模式
其思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。
在我们这里主要就是封住我们的优惠算法啦,试试看。
coding中。。。
30分钟后,代码写完了,见代码如下文
/*** 优惠策略*/
public interface BenefitMethod {double getMoney(double money);}/*** 优惠券策略*/
public class CouponMethod implements BenefitMethod {private final double storeValue;private double needPay;public CouponMethod(double needPay, double storeValue) {this.needPay = needPay;this.storeValue = storeValue;}@Overridepublic double getMoney(double money) {return money >= needPay ? storeValue : 0;}}/*** 折扣策略*/
public class DisCountMethod implements BenefitMethod {private double discount;/*** 折扣策略,传入金额为m,折扣Z,面值为m-mz** @param discount*/public DisCountMethod(double discount) {this.discount = discount;}@Overridepublic double getMoney(double money) {return money - discount * money;}}/*** 储值折扣策略*/
public class DisCountStoreValueMethod implements BenefitMethod {private double discount;private double storeValue;/*** 传入金额为m,折扣Z,储值n,总价为mz; * 储值n大于mz,则储值面值为mz;* 储值n小于等于mz,则为储值面值为n;* 当然优惠部分也是该会员卡的面值 即 (m-mz)+ mz = m 和传入金额一样,即使全部抵扣 或者是储值n小于等于mz, ( m-mz)+ n** @param storeValue 储值* @param discount 折扣*/public DisCountStoreValueMethod(double storeValue, double discount) {this.storeValue = storeValue;this.discount = discount;}@Overridepublic double getMoney(double money) {/*** 传入金额为m,折扣Z,储值n,总价为mz; * 储值n大于mz,则储值面值为mz;* 储值n小于等于mz,则为储值面值为n;* 当然优惠部分也是该会员卡的面值 即 (m-mz)+ mz = m 和传入金额一样,即使全部抵扣 或者是储值n小于等于mz, ( m-mz)+ n*/double allMoney = money * discount;//这里全部钱都被优惠掉了 储值也算优化if (storeValue > allMoney) {return money;}return money - allMoney + storeValue;}}/*** 储值策略*/
public class StoreValueMethod implements BenefitMethod {private double storeValue;/*** 储值策略,传入金额为m,储值n大于m,则面值为m,储值n小于等于m,则为面值为n** @param storeValue 储值*/public StoreValueMethod(double storeValue) {this.storeValue = storeValue;}@Overridepublic double getMoney(double money) {return money >= storeValue ? storeValue : money;}}
上文写完了四种策略,四种策略对实现了优惠策略接口。接下来,我就是要试试可否动态选择对应优化方式,继续Coding
/*** 策略模式版 优惠* 对应 https://blog.csdn.net/u011850446/article/details/88064551* Benefit 相当于Context* BenefitMethod 相当于 Strategy* BenefitMethod的子类 相当于 Strategy子类* 区别在于 一般是我们自己传入相对method 比如public Benefit(BenefitMethod method)* 这里是由后台配置更加灵活*/
public class Benefit {/*** 这里是其他信息* 和本题无关了字段省略*//*** 折扣*/private double discount;/*** 储值*/private double storeValue;/*** 满多少*/private double howMuchLessNeedPay;/*** 减多少*/private double howMuchLessValue;/*** 优惠方式* 上个版本中是有一个会员卡类型* 但是这个版本需要这里后端来告诉我们这个优惠方式了* 平时自己代码中可以通过传值方式*/private int benefitType;/*** 储值卡*/private static final int TYPE_STORE_VALUE = 0;/*** 折扣卡*/private static final int TYPE_DISCOUNT = 1;/*** 储值折扣卡*/private static final int TYPE_STORE_VALUE_DISCOUNT = 2;/*** 优惠券*/private static final int TYPE_COUPON = 3;public double getBenefitValue(double money) {BenefitMethod method = null;switch (benefitType) {case TYPE_STORE_VALUE:method = new StoreValueMethod(storeValue);break;case TYPE_DISCOUNT:method = new DisCountMethod(discount);break;case TYPE_STORE_VALUE_DISCOUNT:method = new DisCountStoreValueMethod(storeValue, discount);break;case TYPE_COUPON:method = new CouponMethod(howMuchLessNeedPay, howMuchLessValue);break;default:break;}//没有优惠策略时 为0if (method == null) {return 0;}return method.getMoney(money);}}
总结
我们根据后台返回结果,计算出对应对优惠方式。优惠券和会员卡都能使用对方对方式,而且计算方式和优化类型都不耦合。对比与第一种方式,类多了。但是整理都代码量应该相对减少了。一般简单情况下,上文都已经足够。但是明显代码都是比较耦合的。但是这篇文章中写的内容是否可以优化优化,我们下文再续。
商城优惠券会员卡系列(二)相关推荐
- 商城优惠券会员卡系列(一)
目录 优惠券系统 优惠券A: 优惠券B: 设计思想: 设计: 代码: 会员卡系统 需求 感受 结果: 优惠券系统 优惠券A: 满多少金额使用 (满m减X元) 优惠券B: 无门槛使用 (减X元) 设计思 ...
- 系列二:最全微商城营销36计!
引言: 当商家的单个获客成本已经上升到二三百元,传统电商行业的天花板如期而至,商家开始绕过平台,寻求新的出路!随之,微信公布月活用户达到11亿,通过微信就可以直接触达消费者,降低获客成本,提高利润,社 ...
- 软件开发随笔系列二——关于架构和模型
软件开发随笔系列二--关于架构和模型 文章目录 软件开发随笔系列二--关于架构和模型 软件模型 功能模型 概念层 边界 参与方 分组分类 逻辑层 功能组织图 层次.模块化 接口 流程模型 概念层 业务 ...
- vivo全球商城优惠券系统架构设计与实践
业务背景 优惠券是电商常见的营销手段,具有灵活的特点,既可以作为促销活动的载体,也是重要的引流入口.优惠券系统是vivo商城营销模块中一个重要组成部分,早在15年vivo商城还是单体应用时,优惠券就是 ...
- 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x-packV5.4.2安装
相关博文: 搜索引擎ElasticSearchV5.4.2系列一之ES介绍 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+klanaV5.4.2+x-p ...
- 【C++自我精讲】基础系列二 const
[C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...
- 人工智能算法通俗讲解系列(二):逻辑回归
2019独角兽企业重金招聘Python工程师标准>>> 今天,我们介绍的机器学习算法叫逻辑回归.它英语名称是Logistic Regression,简称LR. 跟之前一样,介绍这个算 ...
- 【算法系列 二】Stack
为什么80%的码农都做不了架构师?>>> 栈应用的场景: 1.括号问题 2.后缀表达式 3.深度优先遍历 4.保存现场 1. 给定字符串,仅由"()[]{}" ...
- 《CDN 之我见》系列二:原理篇(缓存、安全)
2019独角兽企业重金招聘Python工程师标准>>> <CDN之我见>共由三个篇章组成,分为原理篇.详解篇和陨坑篇.本篇章适合那些从未接触过.或仅了解一些 CDN 专业 ...
最新文章
- redis源码笔记-endian
- Redhat7.3、Oracle12C、4节点环境搭建
- pyinstaller使用方法及案例
- 阿里云积极落实等级保护制度,政务云全国首个通过等保2.0合规评测
- arraylist扩容是创建新数组吗 java_Java编程之数组扩容
- python使用opencv实现人脸识别系统
- 以孩子兄弟链表为存储结构,请设计递归算法求树的高度
- 【Pycharm】连接远程服务器并进行代码上传、调试
- 各大组织大马默认密码
- off cpu linux,宋宝华: 用off-cpu火焰图进行Linux性能分析
- Xcode打包IPA包
- SKLEARN实例:【用随机森林回归填补缺失值】
- 2022年第十三届蓝桥杯JAVA B组部分题解
- Android 11.0 任务栏中清除掉播放器的进程,状态栏仍有音乐播放器状态问题的解决
- ATP 系列无线测温集中采集触摸屏
- 【轻量型卷积网络】ResNeXt网络解析
- 重新网格化Remesh
- “硬脱欧”或引发边界混乱 欧盟呼吁做最坏打算
- 易观分析:2022年Q2中国网络零售B2C市场交易规模达23444.7亿元
- 数组的操作——查表法
热门文章
- 项目前期准备 -- 手把手教你做ssm+springboot入门后端项目黑马程序员瑞吉外卖(一)
- [阿里云]Redis的6379端口开通访问所踩到的坑
- 地图POI(兴趣点)数据的爬虫(突破限制)
- Oracle 发布紧急 Java 更新,修复关键漏洞
- 利用root给软件自动申请无障碍的权限
- php函数不支持的功能有什么,wapl是什么功能?启用有什么用
- anyRTC - 助力双师课堂
- 数据结构学习笔记(c语言版)
- C# 运用 System.Drawing 绘制卡片 (解决:去掉DrawString写出的字体黑边)
- PHP排列运算符优先级,php运算符优先级顺序详解