流程总结"/>
Lottery抽奖策略流程总结
第五节抽奖策略流程
抽奖策略流程:
单项概率:如果抽到未中奖的奖品,则结果为未中奖
整体概率:在整体抽奖概率中排除掉未中奖的奖品,剩余奖品总概率作为抽奖概率,保证必中
1.根据策略ID获取抽奖策略配置,这个配置里面包括:抽奖策略配置(策略方式、策略描述、策略奖品发放方式)、抽奖策略明细(奖品Id、剩余可中奖数量、奖品概率)
2.在内存中初始化抽奖策略信息:校验策略方式,如果是单项概率,则需要做策略数据初始化并保存到内存中,并且保存策略Id及抽奖策略明细,如果是整体概率,则需要保存策略Id及抽奖策略明细
3.获取被排除的奖品列表,这些可能是由于风控策略、奖品库存为空、临时调整
4.执行抽奖算法
5.包装抽奖结果
第五节中,抽奖的实现是在一个类的方法中顺序执行,不能做到易维护、易扩展,耦合度高
问题一:
@Resource注解引入抽奖实现类爆红
@Resource(name = "defaultRateRandomDrawAlgorithm") private IDrawAlgorithm drawAlgorithm;
问题原因:引用的对象包名不在启动类或子包下(来源:魏哈哈)
解决方案:①将引用对象包名改为启动类同级别或子包下②在启动类上加@ComponentScan注解,value值为引用对象所在包
问题二:
当策略方式为2即单项随机概率时,rateTuple数组结果集为空,程序报空指针异常
问题原因:在校验并初始化策略数据到内存中的代码中,如果策略方式为2即单项随机概率时直接返回了,没有做数组结果集的初始化以及存储,导致在抽奖方法中结果集为空
解决方案:修改校验和初始化方法的代码,当策略方式为2时初始化并存储数据到数组中再返回
学习收获:理解了两种策略方式的核心,单项随机概率中用到了斐波那契数列计算哈希值,使数据更加散列,很大程度上减少了哈希冲突,同时也使得抽奖获取奖品的复杂度为O(1),个人感觉有一些空间换时间的思想;从开始搭建项目也使得自己对boot项目以及注解的使用更加熟悉;同时对抽奖的业务也有了初步的理解
第六节使用模板模式实现抽象策略流程
在第五节的抽奖策略流程中,发现有一些流程可以抽象到父类中,而有一些涉及到不同业务可能有不同的实现的流程可以交给不同的子类去完成,也就是代码还没有做到易维护、易扩展、低耦合,不够抽象。
AbstractDrawBase:定义抽象抽奖过程,定义可抽象的方法:获取不在抽奖范围内的列表、(该方法可能会有多种实现,比如风控、库存为空、临时调整等)、执行抽奖算法(可能会存在业务处理);定义非抽象的校验抽象策略是否初始化到内存中的方法、构造抽奖结果、
DrawConfig:抽奖配置类,负责容器启动时初始化不同策略方式的抽奖算法实现类
DrawStrategySupport:负责策略数据仓储层
DrawExecImpl:抽奖过程方法的具体实现,实现了获取排除的奖品和具体的抽奖方法
问题一:
java.lang.NullPointerException
at cn.itedus.lottery.domain.strategy.service.algorithm.impl.EntiretyRateRandomDrawAlgorithm.randomDraw(EntiretyRateRandomDrawAlgorithm.java:28)
策略方式为2时,抽奖策略奖品集为空
问题原因:当策略方式为2时,checkAndInitRateData方法直接返回,没有做抽奖策略奖品的初始化
解决方案:当策略方式为2时,先做抽奖策略奖品的初始化后再返回
学习收获:利用设计模式实现抽奖策略流程,加深了对于模板模式的理解,定义主流程,不同的业务可以有不同的实现,但主流程不变,提取可公共抽象的部分,做到了易维护、可扩展,自己也对于设计模式的思想认识更深刻
更多推荐
Lottery抽奖策略流程总结
发布评论