规则引擎
本人也是在一次群里讨论技术的时候,听到这个名词的。当时是由大佬烟随口提出,我当时也蛮好奇的,
既然可以使用代码逻辑实现,为啥要用到规则引擎呢?
总结一点:在大量的规则下,维护这套逻辑是很复杂的,其次如果是规则经常变化,规则复杂,
可以使用规则引擎来实现规则的编写。
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;
}
编写购物车结算业务规则
- 满n件减x元
- 满多少元减x元
- 会员积分满多少元减多少元
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());
}
最终测试