基于drools的优惠券设计

key

drools,优惠券,表达式引擎,教程

introduce

Drools引擎,是一个面向对象规则引擎,使用java对RETE算法的实现,大概思路是
每个规则的条件就是一个个节点,把所有的节点进行组合,然后进行匹配。具体的介绍
可以看官方的教程文档,不过官方文档感觉写的很一般那,所以 以下是两个比较好的介绍使用drools引擎的网站。
https://training-course-material.com/training/Filip_Drools_Decision_Tables_in_Spreadsheets
https://docs.jboss.org/drools/release/5.2.0.Final/drools-expert-docs/html/ch06.html

why

公式让设计一个商城数据库模型,设计好了,发现还需要一个优惠活动模型,但是优惠活动是随着时间的发展
动态的进行更新的,而且变动特别大,之前在网上看的基本都是使用java抽象的思想,抽象出一个活动的接口CouponAble
CouponAbstract,然后就是各种实现了,把产品的list作为参数,然后把优惠活动实体类组成责任链模式,然后进行匹配
进行计算优惠金额,但是这种方式没办法处理规则的互斥,分组,优先级,甚至是流程化,每次新增一个或者修改一个已有
的优惠活动都是很麻烦的,不仅达不到开闭原则的目标,而且作为一个开发真我觉得,这样实现的代码实在是没有想象力。

method1,表达式引擎

自己想到的第二种实现方式是使用表达式引擎,通过设计表达式引擎,来存储规则,规则的变动就是修改表达式就行了
这种方式如果不涉及互斥,优先级,只是简单的进行平台优惠活动是一个很好的选择,或者自己把优惠活动进行分级
分组,每次计算从优先级高的到低的这种也是没有问题的,具体表达式引擎java也有很多我使用过的是google的
Aviator,github网址是https://github.com/killme2008/aviator ,用起来也比较简单,就是和excell的一样
完全可以在excell中写函数,写好之后用这个进行测试,很方便。由于之前做过使用Aviator来解析excell函数,通过
java实现excell公式的计算,所以这里有一个改进之后的Aviator适配excell大部分函数,除了offset。以下是链接
https://github.com/Notelzg/javaReview/tree/master/work/blog/excel-tools
Aviator的原理很简单就是使用栈来解析表达式,生成相关的对象,然后进行计算,不过这里面生成对象使用的字节码技术
直接生成的动态对象这一段说实话还没看懂。计算采用的思想还是责任链。

method2,规则引擎

表达式引擎被领导喷了,然后就自己想做优惠券主要的还是制定规则, 然后对规则进行组合就好了,有新的优惠活动
需要做的就是产生新的规则,或者是对已有规则的组合就可以实现了,完全不需要修改代码,规则可以是配置文件,也
可以是字符串,而且是一次性处理你提供的所有规则,自带责任链处理,完全可以把优惠券存储到数据库,用户使用的
时候拼接成一个长的字符串或者规则文件,进行处理。而且还支持规则的互斥优先级,分组,甚至是流程控制,而且
是面向对象的在规则文件中可以写java代码。优点很多,缺点也是很明显首先用起来比较麻烦,规则文件的生成也很麻烦
因为功能很多需要一个个测试找到自己想要的功能,而且有一些规则的处理还没有相关的文档,导致用起来吧确实
是不太容易使用,不过配置好之后,确实很方便,符合开闭原则哈哈。

本项目

项目github地址:https://github.com/Notelzg/mall/tree/dev/coupon-service
本项目就是使用drools类实现优惠活动的一个demo,主要是通过测试代码来实现,通过读取excell,drl,字符串三种方式
读取规则文件都给出了测试用例,而且包含一个简单的商品,订单,优惠,实体类设计,实体类主要是为了演示可行性,
不具备实用性,优点就是确实是实现了了一个优惠券系统,缺点就像是刚才说的由于drools本身的特性,因为没有使用
drools的流程功能来控制流,而drools分组之后,组的优先级也没有明确说明,还有就是用户可用优惠券的匹配,只有两种情况
命中规则之后记录规则到规则列表中,还有就是自己写程序计算出可用优惠券,可用优惠券大部分情况下也是自己写程序进行处理
如果是计算前先选择优惠券的话,那样是最好的,直接把可用优惠券传递进去,也不需要分组。这样可用优惠券的处理
就独立出来了,其实后来考虑过,可用优惠券用规则引擎也做不出来,因为可用优惠券中肯定存在互斥的优惠券,不过
这个问题应该不大。

测试的demo在测试目录下面

优惠券系统确实是一个系统服务,一个独立模块,不需要和订单放在一起,减少耦合。不过以上只是一个自己的思路,
而且都是实验性质的,具体系统使用中还没有进行,这个就是提供一个思路,demo,而且也是记录。

原文链接:https://blog.csdn.net/li740207611/article/details/102720763?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165277499316782388046619%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165277499316782388046619&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-12-102720763-null-null.nonecase&utm_term=%E4%BC%98%E6%83%A0

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
文明发言,共建和谐米科社区
提交
头像

昵称

取消
昵称表情图片

    暂无评论内容