Easy Rules
是一个轻量级且易于使用的规则引擎,适用于Java应用。下面是一个简单的示例,演示如何使用 Easy Rules
定义和执行规则。
添加依赖
首先,在你的Java项目中添加 Easy Rules 的 Maven 依赖(如果你使用的是Maven构建工具):
xml
<dependency>
<groupId>org.jeasy</groupId>
<artifactId>easy-rules-core</artifactId>
<version>4.3.0</version> <!-- 确保检查最新版本 -->
</dependency>
简单案例
创建规则
接下来,定义一个简单的规则。假设我们有一个业务需求:如果一个人的年龄大于18岁,则认为这个人是成年人。
java
import org.jeasy.rules.annotation.Action;
import org.jeasy.rules.annotation.Condition;
import org.jeasy.rules.annotation.Fact;
import org.jeasy.rules.annotation.Rule;
@Rule(name = "adult rule", description = "if person's age is greater than 18 then he is an adult")
public class AdultRule {
@Condition
public boolean check(@Fact("age") int age) {
return age > 18;
}
@Action
public void execute() throws Exception {
System.out.println("You are an adult.");
}
}
执行规则
然后,创建一个简单的应用程序来执行这些规则:
java
import org.jeasy.rules.api.Facts;
import org.jeasy.rules.api.Rules;
import org.jeasy.rules.api.RulesEngine;
import org.jeasy.rules.core.DefaultRulesEngine;
public class Application {
public static void main(String[] args) {
// Create facts
Facts facts = new Facts();
facts.put("age", 20); // 假设这个人的年龄是20岁
// Create rules
Rules rules = new Rules();
rules.register(new AdultRule());
// Create a rules engine and fire rules on known facts
RulesEngine rulesEngine = new DefaultRulesEngine();
rulesEngine.fire(rules, facts);
}
}
在这个例子中,我们首先创建了一些事实(Facts),即这里的人的年龄为20岁。接着,我们定义了一个规则(AdultRule),该规则根据年龄判断是否为成年人。最后,我们使用 DefaultRulesEngine
来触发规则,并基于提供的事实进行评估。
当你运行上述代码时,应该会在控制台看到输出:"You are an adult." 这表明规则已经成功执行并得出结论。
通过这种方式,你可以轻松地在自己的项目中集成和使用 Easy Rules
来处理各种业务逻辑。它不仅简化了规则的定义过程,还使得维护和更新规则变得更为直观和直接。
当然,下面是一个更复杂的 Easy Rules
使用案例,模拟一个电商场景中的订单处理系统。在这个案例中,我们将根据订单金额、用户等级和促销活动来决定是否应用折扣、是否免运费,以及是否需要额外的审核。
复杂案例
场景描述
- 用户等级:普通用户(regular)、VIP 用户(vip)
- 订单金额:大于 100 元可以免运费
- 促销活动:如果当前有促销活动,所有订单享受 10% 折扣
- VIP 用户:额外享受 5% 折扣
- 高价值订单:订单金额超过 500 元,需要额外审核
1. 定义事实类(Facts)
java
// Order.java
public class Order {
private double amount;
private String userLevel; // "regular" or "vip"
private boolean isPromotionActive;
private boolean isFreeShipping;
private double finalAmount;
private boolean requiresReview;
// 构造函数
public Order(double amount, String userLevel, boolean isPromotionActive) {
this.amount = amount;
this.userLevel = userLevel;
this.isPromotionActive = isPromotionActive;
this.finalAmount = amount;
this.isFreeShipping = false;
this.requiresReview = false;
}
// Getter 和 Setter 方法
public double getAmount() { return amount; }
public String getUserLevel() { return userLevel; }
public boolean isPromotionActive() { return isPromotionActive; }
public boolean isFreeShipping() { return isFreeShipping; }
public void setFreeShipping(boolean freeShipping) { this.isFreeShipping = freeShipping; }
public double getFinalAmount() { return finalAmount; }
public void setFinalAmount(double finalAmount) { this.finalAmount = finalAmount; }
public boolean isRequiresReview() { return requiresReview; }
public void setRequiresReview(boolean requiresReview) { this.requiresReview = requiresReview; }
@Override
public String toString() {
return "Order{" +
"amount=" + amount +
", userLevel='" + userLevel + '\'' +
", isPromotionActive=" + isPromotionActive +
", isFreeShipping=" + isFreeShipping +
", finalAmount=" + finalAmount +
", requiresReview=" + requiresReview +
'}';
}
}
2. 定义多个规则
规则 1:免运费规则
java
import org.jeasy.rules.annotation.*;
import org.jeasy.rules.api.Facts;
@Rule(name = "Free Shipping Rule", priority = 3)
public class FreeShippingRule {
@Condition
public boolean isEligibleForFreeShipping(@Fact("order") Order order) {
return order.getAmount() > 100;
}
@Action
public void applyFreeShipping(@Fact("order") Order order) {
order.setFreeShipping(true);
System.out.println("免运费已应用:订单金额 > 100元");
}
}
规则 2:促销折扣规则
java
@Rule(name = "Promotion Discount Rule", priority = 2)
public class PromotionDiscountRule {
@Condition
public boolean isPromotionActive(@Fact("order") Order order) {
return order.isPromotionActive();
}
@Action
public void applyPromotionDiscount(@Fact("order") Order order) {
double discount = order.getFinalAmount() * 0.10;
order.setFinalAmount(order.getFinalAmount() - discount);
System.out.println("促销折扣 10% 已应用");
}
}
规则 3:VIP 用户额外折扣
java
@Rule(name = "VIP Discount Rule", priority = 1)
public class VipDiscountRule {
@Condition
public boolean isVipUser(@Fact("order") Order order) {
return "vip".equalsIgnoreCase(order.getUserLevel());
}
@Action
public void applyVipDiscount(@Fact("order") Order order) {
double discount = order.getFinalAmount() * 0.05;
order.setFinalAmount(order.getFinalAmount() - discount);
System.out.println("VIP 用户额外 5% 折扣已应用");
}
}
规则 4:高价值订单审核规则
java
@Rule(name = "High Value Order Review Rule", priority = 0)
public class HighValueOrderReviewRule {
@Condition
public boolean isHighValueOrder(@Fact("order") Order order) {
return order.getAmount() > 500;
}
@Action
public void flagForReview(@Fact("order") Order order) {
order.setRequiresReview(true);
System.out.println("高价值订单,需人工审核");
}
}
3. 主程序执行规则
java
import org.jeasy.rules.api.*;
import org.jeasy.rules.core.DefaultRulesEngine;
public class OrderProcessingExample {
public static void main(String[] args) {
// 创建订单事实
Order order = new Order(550.0, "vip", true); // 金额550,VIP用户,促销中
Facts facts = new Facts();
facts.put("order", order);
// 注册所有规则
Rules rules = new Rules();
rules.register(new FreeShippingRule());
rules.register(new PromotionDiscountRule());
rules.register(new VipDiscountRule());
rules.register(new HighValueOrderReviewRule());
// 创建规则引擎并执行
RulesEngine rulesEngine = new DefaultRulesEngine();
rulesEngine.fire(rules, facts);
// 输出最终订单状态
System.out.println("\n最终订单信息:");
System.out.println(order);
}
}
4. 运行结果输出
免运费已应用:订单金额 > 100元
促销折扣 10% 已应用
VIP 用户额外 5% 折扣已应用
高价值订单,需人工审核
最终订单信息:
Order{amount=550.0, userLevel='vip', isPromotionActive=true, isFreeShipping=true, finalAmount=467.5, requiresReview=true}
说明
- 优先级(priority):数值越小,优先级越高。例如,高价值订单审核规则最后执行,但优先级最高(0),确保它在所有计算后仍能被触发。
- 规则解耦:每个规则独立,易于维护和测试。
- 可扩展性:你可以轻松添加新规则,如"节假日双倍积分"、"地区限制"等。
这个案例展示了 Easy Rules
如何处理多条件、多动作的复杂业务逻辑,同时保持代码清晰和可维护性。非常适合中小型系统中实现灵活的业务规则管理。