设计模式之模板方法实现抽奖功能

1.项目背景

接到一个需求,实现电商营销模块的圆盘抽奖功能。如果大家有关注市面上的抽奖,大致也是圆盘抽奖、九宫格抽奖,随机抽球等等。尤其是电商行业,会有各种各样的活动,因此也会出现各式各样的抽奖,那么如何更好写出抽奖模块的代码呢?基于博主涉及的业务需求,决定采用设计模式的模板方法

抽奖功能主要做几件事分别是:1.初始化奖品  2.抽奖  3.发放奖品 

那么这三件事,其实就放到模板方法的抽象类。
AbstractLotteryBaseTemplate 基础抽奖类

draw()是核心抽奖方法,里面分别调用了 executeDraw(),sendGift(),不管哪个实现类实现后,只需要调用draw()即可。具体大家可以往下看。最后会有具体调用。

/*** @description: 抽奖模板方法基础实现* @author: llk* @date: 2022/8/29*/
public abstract class AbstractLotteryBaseTemplate {/*** @description: 执行抽奖* @author: llk* @date: 2022/8/29*/abstract protected LotteryPrize executeDraw(Long lotteryId);/*** @description: 发放奖品* @author: llk* @date: 2022/8/29*/abstract protected void sendGift(LotteryPrize lotteryPrize);/*** @description: 初始化奖品* @author: llk* @date: 2022/8/26*/private void initLotteryPrize(Long lotteryId,List<LotteryPrize> lotteryPrizeList) {// todo}/*** @description: 开始抽奖* @author: llk* @date: 2022/8/26*/public LotteryDrawResultServiceResp draw(Long lotteryId){//0.基础校验if(userId == null || userId == 0L){throw new ResultException("用户id不能为空");}if(lotteryId == null || lotteryId == 0L){throw new ResultException("抽奖ID不能为空");}Lottery lottery = lotteryDaoService.getById(lotteryId);if(lottery == null){throw new ResultException("不存在此抽奖活动");}//1.校验抽奖模块validLottery(lottery,lotteryPrizeList);//2.校验个人抽奖限制,如是否有权限,抽奖次数限制validPersonDraw(lotteryId, userId, lotteryUserCount);//3.初始化礼品概率队列initLotteryPrize(lotteryId,lotteryPrizeList);//4.抽奖LotteryPrize resultPrize = executeDraw(lotteryId);//5. 继续写一些核心业务,譬如抽奖次数减 1,抽奖结果入库等//6.发放奖品sendGift(lotteryPrize);}
}

大家可以看到 executeDraw(),sendGift()已经定义成了抽象方法,意味着这些核心关键的代码,有具体的抽奖实现类实现。因为不同的抽奖业务会有不同的规则限制和奖品发放。譬如:

圆盘抽奖:executeDraw里面的实现是用户必须下单了某商品才能抽奖。

                  sendGift里面发放的积分使我们电商系统的,直接调我们接口即可。

红包抽奖:executeDraw里面的实现是用户领了优惠券才能抽奖。

                  sendGift里面发京东卡,需要对接京东。

大家可以看到,不同的抽奖方式,两块的抽奖的内容不一样。但是初始化奖品等等,基础抽奖校验是一样的。

接下来给大家看下具体的具体后抽奖实现类。

TurntableLotteryTemplate 圆盘抽奖

/*** @description: 转盘抽奖* @author: llk* @date: 2022/8/29*/
public class TurntableLotteryTemplate extends AbstractLotteryBaseTemplate{@Overrideprotected LotteryPrize executeDraw(Long lotteryId) {// 校验用户必须下单了某商品才能抽奖return resultPrize;}@Overrideprotected void sendGift(LotteryPrize lotteryPrize) {// 发放积分礼品}​​​​​​​}
RedBagLotteryTemplate 红包抽奖
/*** @description: 转盘抽奖* @author: llk* @date: 2022/8/29*/
public class TurntableLotteryTemplate extends AbstractLotteryBaseTemplate{@Overrideprotected LotteryPrize executeDraw(Long lotteryId) {// 校验用户领了优惠券才能抽奖return resultPrize;}@Overrideprotected void sendGift(LotteryPrize lotteryPrize) {// 发放京东卡,调京东第三方接口}​​​​​​​}

最后的使用就是这样,各个抽奖方式的具体实现类直接调用draw()抽奖方法即可。


public LotteryDrawResultServiceResp draw(Long lotteryId) {Lottery lottery = daoService.getById(lotteryId);if(lottery == null){throw new ResultException("不存在此抽奖活动");}//具体哪个抽奖方式由开发自行去定义用哪个方式if(LotteryActivityTypeEnum.RED_BAG.getKey().equals(lottery.getActivityType())){return redBagLotteryTemplate.draw(lotteryId);}return turntableLotteryTemplate.draw(lotteryId);
}

最后,博主营销模块抽奖方式目前只有红包和圆盘,后续可能会有九宫抽奖,那么只需要实现AbstractLotteryBaseTemplate ,写自己的特殊的业务实现executeDraw(),sendGift()即可。这样就可以省略各种各样的校验等等,代码也易于维护。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20014.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eclipse控制台输出log4j日志乱码解决

1. 出现乱码可能是编码格式对应不起来&#xff0c;主要是Eclipse控制台编码和log4j编码的匹配 log4j.properties 主要是查看这两个地方编码一致不一致&#xff0c;如果不一致则手动更改成一致编码&#xff0c;GBK或UTF-8

2023年9月广州/重庆/长沙/深圳DAMA-CDGA/CDGP认证考试报名

据DAMA中国官方网站消息&#xff0c;2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启&#xff0c;相关事宜通知如下&#xff1a; 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA) 数据治理专家(CertifiedDataGovernanc…

基于单片机的智能温控风扇的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b; 液晶显示当前温度&#xff0c;风速等级&#xff0c;自动手动模式息&#xff1b; DS18B20检测当前的温度&#xff1b; 按键设置温度上限&#xff1b; 手动模式下&#xff1a; 直接控制风扇档位&#xff0c;可以开启/关闭风扇&a…

【ubuntu重装系统后的软件配置_memo】

重装系统后系统环境恢复 备份安装系统常用的一些debvscode 更改sourcespip加速爬长城的家伙式儿安装ROS安装cmake安装git安装zsh顺便开个ssh提升幸福感的映射配置neovimplugins字体插件遇到的问题 锁键盘/鼠标小玩意儿 备份 实验时不起眼的图顺手写的脚本忘记从哪儿下载的资源…

计算机网关原理、子网掩码原理(路由器、交换机)(网关:与以太网接口关联的路由)

文章目录 网关网关的历史网关的功能网关的原理相关疑问为什么用子网掩码与IP地址进行与运算来确定一个IP地址所属的子网&#xff1f;网关地址是谁定的&#xff0c;是配置路由的人随意定的吗&#xff1f;&#xff08;配置人员定的&#xff09;如何正确设置网关地址&#xff08;路…

【SAP UI5 控件学习】DAY03 Input组Part III

1. Input 控件 1.1 最简单的Input控件 在UI5框架中&#xff0c;最简单的Input控件也提供了输入提示功能。当用户输入内容的时候&#xff0c;会自动匹配Input控件中所绑定的JSON模型中是数据。 Input的默认匹配规则是匹配从头匹配每一个单词 前端代码如下&#xff1a; <mv…

中值滤波的运用

需求&#xff1a; c#、WPF开发&#xff0c;在界面上画不规则的图形区域&#xff0c;并提取区域内的point 实现方式&#xff1a; 1. 用 InkCanvas控件作为画布&#xff0c;用path画不规则图形 2. 将InkCanvas控件内的内容保存为jpg图片 3. 通过判断区域的颜色&#xff0c;从而得…

ARP协议(地址分析协议)

系列文章目录 数通王国历险记&#xff08;4&#xff09; 目录 前言 一&#xff0c;什么是地址解析协议&#xff08;ARP&#xff09; 二&#xff0c;封装和解封装 三&#xff0c;为什么需要地址解析协议&#xff08;ARP&#xff09; 四&#xff0c;ARP的验证实验 4.1&#x…

Foxit PDF ActiveX 5.9.8 Crack

Foxit PDF SDK ActiveX 即时添加PDF显示功能至Windows应用程序&#xff0c;快速投放市场&#xff0c;可视化编程组件功能强大且易于使用的PDF软件开发工具包 对于刚接触PDF或不愿投入过多精力学习PDF技术的产品管理者及开发者来说&#xff0c;Foxit PDF SDK ActiveX无疑是理想…

Xamarin.Android实现界面自动添加控件

目录 1、背景说明2、效果3、代码3.1、UI代码3.2、实现代码 4、代码下载5、相关知识点5.1、原理说明5.2、其他说明 6、参考资料 1、背景说明 有时需要在APP中动态的添加控件&#xff0c;因此记录下在Xamarin中的实现步骤。 VS2022社区版 2、效果 3、代码 3.1、UI代码 UI的代…

22 分页控件

文章目录 界面设置初始化主对话框子页面初始化 页面1枚举窗口页面2枚举进程全部代码 界面设置 ui 设置 >创建CTablCtrl > 创建页控件&#xff08;子窗口&#xff09;&#xff0c;style设置成为chlid 添加类 页面中加入listCtrl 控件 添加变量 分别添加初始化函数 初始化…

U启动盘(NETBASE第十二课)

1.域环境组策略的应用规则 1&#xff09;策略的继承 继承&#xff1a;默认下级容器继承上级容器的组策略配置Default Domain Policy禁止更改桌面背景运行-dsa.msc创建OU并命名为caiwu&#xff0c;在caiwu的OU中创建新用户xmxm用户在win10客户端主机登录&#xff0c;验证不能更…