基于drools规则引擎实现简单的结算最优策略

规则引擎

本人也是在一次群里讨论技术的时候,听到这个名词的。当时是由大佬烟随口提出,我当时也蛮好奇的,
既然可以使用代码逻辑实现,为啥要用到规则引擎呢?

总结一点:在大量的规则下,维护这套逻辑是很复杂的,其次如果是规则经常变化,规则复杂,
可以使用规则引擎来实现规则的编写。

drools

用XML节点来规范If–Then句式和事实的定义,使引擎干起活来很舒服。 而使用Java,Groovy等原生语言来做判断和执行语句,让程序员很容易过渡、移植,学习曲线很低。
在这里插入图片描述

实战

我们来借鉴一下网上的demo来实现简单购物车不同策略,最优选择的实现。

demo

开发

定义购物车类Car

package com.neo.drools.model;

import lombok.Data;

/**
 * @author M
 */
@Data
public class Car {

    public Car(){
        this.lastPrice = 100;
    }

    /**
     * 满多少件
     */
    private Integer piece;

    /**
     * 满多少钱
     */
    private Integer price;

    /**
     * 用户有多少积分
     */
    private Integer score;

    /**
     * 最终价格
     */
    private Integer lastPrice;


}

编写购物车结算业务规则

  1. 满n件减x元
  2. 满多少元减x元
  3. 会员积分满多少元减多少元
package plausibcheck.car

import com.neo.drools.model.Car;
import com.alibaba.fastjson.JSON;


rule "piece"
    when
        car : Car(piece > 4 &&  piece < 70)
    then
        System.out.println(JSON.toJSONString(car));
        Integer price=car.getPrice()-car.getPiece()*2;
        car.setLastPrice(car.getLastPrice()>price?price:car.getLastPrice());
		System.out.println("piece规则");
end

rule "price"
    when
        car : Car(price > 100 && price < 920 )
    then
        System.out.println(JSON.toJSONString(car));
        Integer price=car.getPrice()-car.getPrice()/2;
        car.setLastPrice(car.getLastPrice()>price?price:car.getLastPrice());
		System.out.println("price规则");
end

rule "score 100-200积分"
    when
        car : Car(score > 100 && score < 200 )
    then
    System.out.println(JSON.toJSONString(car));
        Integer price=car.getPrice()-car.getScore()/5-20;
        car.setLastPrice(car.getLastPrice()>price?price:car.getLastPrice());
		System.out.println("score 100-200积分规则");
end

rule "score 200-300积分"
    when
        car : Car(score > 200 && score < 300 )
    then
    System.out.println(JSON.toJSONString(car));
        Integer price=car.getPrice()-car.getScore()/5-30;
        car.setLastPrice(car.getLastPrice()>price?price:car.getLastPrice());
		System.out.println("score 200-300积分规则");
end

优化点

car.getLastPrice()>price?price:car.getLastPrice() 将每个符合的策略都算一遍,如果是最低的价格,则放到最终价格中。当然这些策略我们也能保存起来,类似策略code,匹配用户拥有这些策略再进行结算。还有最后的返回最优策略的code给前端进行展示等等。

测试demo

@ResponseBody
    @RequestMapping("/car")
    public void car(Integer piece,Integer price,Integer score) {

        Car car = new Car();
        car.setPiece(piece);
        car.setPrice(price);
        car.setScore(score);
        KieSession kieSession = kieContainer.newKieSession();
        kieSession.insert(car);
        int ruleFiredCount = kieSession.fireAllRules();
        kieSession.destroy();
        System.out.println("触发了" + ruleFiredCount + "条规则");
        System.out.println("价格:"+car.getLastPrice());
    }

最终测试
在这里插入图片描述

代码地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值