本文目录导读:

我来为您提供一个完整的Java规则引擎实现案例,这个案例将展示如何构建一个灵活、可扩展的规则引擎系统。
核心接口设计
// 规则接口
public interface Rule {
String getRuleId();
boolean evaluate(Map<String, Object> facts);
void execute(Map<String, Object> facts);
int getPriority();
}
// 规则引擎接口
public interface RuleEngine {
void registerRule(Rule rule);
void executeRules(Map<String, Object> facts);
List<Rule> getExecutedRules();
}
基础实现
// 抽象规则类 - 提供模板方法
public abstract class AbstractRule implements Rule {
protected String ruleId;
protected int priority = 1;
public AbstractRule(String ruleId) {
this.ruleId = ruleId;
}
@Override
public String getRuleId() {
return ruleId;
}
@Override
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
// 模板方法模式
@Override
public void execute(Map<String, Object> facts) {
if (evaluate(facts)) {
System.out.println("执行规则: " + ruleId);
executeAction(facts);
}
}
protected abstract boolean evaluate(Map<String, Object> facts);
protected abstract void executeAction(Map<String, Object> facts);
}
// 简单规则引擎实现
public class SimpleRuleEngine implements RuleEngine {
private List<Rule> rules = new ArrayList<>();
private List<Rule> executedRules = new ArrayList<>();
@Override
public void registerRule(Rule rule) {
rules.add(rule);
// 按优先级排序
rules.sort((r1, r2) -> r2.getPriority() - r1.getPriority());
}
@Override
public void executeRules(Map<String, Object> facts) {
executedRules.clear();
for (Rule rule : rules) {
if (rule.evaluate(facts)) {
rule.execute(facts);
executedRules.add(rule);
}
}
}
@Override
public List<Rule> getExecutedRules() {
return new ArrayList<>(executedRules);
}
}
具体规则实现
// 购物折扣规则
public class DiscountRule extends AbstractRule {
public DiscountRule(String ruleId) {
super(ruleId);
}
@Override
protected boolean evaluate(Map<String, Object> facts) {
Double totalAmount = (Double) facts.get("totalAmount");
return totalAmount != null && totalAmount > 1000;
}
@Override
protected void executeAction(Map<String, Object> facts) {
Double totalAmount = (Double) facts.get("totalAmount");
Double discount = totalAmount * 0.1;
facts.put("discount", discount);
facts.put("discountedAmount", totalAmount - discount);
System.out.println("订单金额超过1000元,享受9折优惠");
}
}
// 会员等级规则
public class VIPRule extends AbstractRule {
public VIPRule(String ruleId) {
super(ruleId);
}
@Override
protected boolean evaluate(Map<String, Object> facts) {
Integer points = (Integer) facts.get("points");
return points != null && points > 5000;
}
@Override
protected void executeAction(Map<String, Object> facts) {
Double extraDiscount = 0.05;
Double currentDiscount = (Double) facts.getOrDefault("discount", 0.0);
facts.put("discount", currentDiscount + extraDiscount);
System.out.println("VIP会员额外享受5%折扣");
}
}
// 库存检查规则
public class StockCheckRule extends AbstractRule {
public StockCheckRule(String ruleId) {
super(ruleId);
}
@Override
protected boolean evaluate(Map<String, Object> facts) {
Integer stock = (Integer) facts.get("stock");
Integer quantity = (Integer) facts.get("quantity");
return stock != null && quantity != null && stock >= quantity;
}
@Override
protected void executeAction(Map<String, Object> facts) {
System.out.println("库存验证通过,可以继续下单");
facts.put("stockAvailable", true);
}
}
// 黑名单检查规则
public class BlacklistRule extends AbstractRule {
private Set<String> blacklist;
public BlacklistRule(String ruleId) {
super(ruleId);
this.blacklist = new HashSet<>(Arrays.asList("user123", "user456"));
}
@Override
protected boolean evaluate(Map<String, Object> facts) {
String userId = (String) facts.get("userId");
return blacklist.contains(userId);
}
@Override
protected void executeAction(Map<String, Object> facts) {
facts.put("isBlocked", true);
System.out.println("用户被列入黑名单,禁止下单");
}
}
复杂规则实现(组合规则)
// 复合规则 - 逻辑组合
public class CompositeRule extends AbstractRule {
private List<Rule> conditions = new ArrayList<>();
private LogicalOperator operator;
public enum LogicalOperator {
AND, OR
}
public CompositeRule(String ruleId, LogicalOperator operator) {
super(ruleId);
this.operator = operator;
}
public void addCondition(Rule rule) {
conditions.add(rule);
}
@Override
protected boolean evaluate(Map<String, Object> facts) {
if (operator == LogicalOperator.AND) {
return conditions.stream().allMatch(r -> r.evaluate(facts));
} else {
return conditions.stream().anyMatch(r -> r.evaluate(facts));
}
}
@Override
protected void executeAction(Map<String, Object> facts) {
System.out.println("组合规则: " + ruleId + " 执行");
}
}
// 条件规则 - 带条件的规则
public class ConditionalRule extends AbstractRule {
private Predicate<Map<String, Object>> condition;
private Consumer<Map<String, Object>> action;
public ConditionalRule(String ruleId,
Predicate<Map<String, Object>> condition,
Consumer<Map<String, Object>> action) {
super(ruleId);
this.condition = condition;
this.action = action;
}
@Override
protected boolean evaluate(Map<String, Object> facts) {
return condition.test(facts);
}
@Override
protected void executeAction(Map<String, Object> facts) {
action.accept(facts);
}
}
规则配置加载器
// JSON规则配置加载器
public class JsonRuleLoader {
public List<Rule> loadRules(String jsonPath) throws IOException {
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(new File(jsonPath));
List<Rule> rules = new ArrayList<>();
for (JsonNode ruleNode : root.get("rules")) {
String type = ruleNode.get("type").asText();
String id = ruleNode.get("id").asText();
int priority = ruleNode.get("priority").asInt();
Rule rule = createRule(type, id, ruleNode);
if (rule instanceof AbstractRule) {
((AbstractRule) rule).setPriority(priority);
}
rules.add(rule);
}
return rules;
}
private Rule createRule(String type, String id, JsonNode config) {
switch (type) {
case "discount":
return createDiscountRule(config);
case "vip":
return new VIPRule(id);
case "stock":
return new StockCheckRule(id);
default:
throw new IllegalArgumentException("未知规则类型: " + type);
}
}
private Rule createDiscountRule(JsonNode config) {
return new ConditionalRule("discount_" + config.get("id").asText(),
facts -> {
Double amount = (Double) facts.get("totalAmount");
return amount != null && amount > config.get("threshold").asDouble();
},
facts -> {
Double amount = (Double) facts.get("totalAmount");
Double discount = amount * config.get("rate").asDouble();
facts.put("discount", discount);
System.out.println("应用折扣: " + discount);
}
);
}
}
使用示例
public class RuleEngineExample {
public static void main(String[] args) {
// 创建规则引擎
RuleEngine engine = new SimpleRuleEngine();
// 注册规则
engine.registerRule(new DiscountRule("discount_rule"));
engine.registerRule(new VIPRule("vip_rule"));
engine.registerRule(new StockCheckRule("stock_rule"));
engine.registerRule(new BlacklistRule("blacklist_rule"));
// 执行顺序可以控制
// 创建组合规则
CompositeRule compositeRule = new CompositeRule("composite_rule",
CompositeRule.LogicalOperator.AND);
compositeRule.addCondition(new StockCheckRule("stock_condition"));
compositeRule.addCondition(new DiscountRule("discount_condition"));
engine.registerRule(compositeRule);
// 准备事实数据
Map<String, Object> facts = new HashMap<>();
facts.put("userId", "user123");
facts.put("totalAmount", 1500.0);
facts.put("points", 6000);
facts.put("stock", 10);
facts.put("quantity", 5);
// 执行规则
System.out.println("=== 开始执行规则 ===");
engine.executeRules(facts);
// 输出结果
System.out.println("\n=== 执行结果 ===");
System.out.println("执行的规则数量: " + engine.getExecutedRules().size());
System.out.println("是否被阻止: " + facts.getOrDefault("isBlocked", false));
System.out.println("折扣金额: " + facts.getOrDefault("discount", 0.0));
System.out.println("库存可用: " + facts.getOrDefault("stockAvailable", false));
System.out.println("最终金额: " + facts.getOrDefault("discountedAmount", facts.get("totalAmount")));
}
}
// 注解驱动规则示例
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface RuleAnnotation {
String id();
int priority() default 1;
}
@RuleAnnotation(id = "annotation_rule", priority = 5)
public class AnnotationRule extends AbstractRule {
public AnnotationRule() {
super("annotation_rule");
}
@Override
protected boolean evaluate(Map<String, Object> facts) {
return true;
}
@Override
protected void executeAction(Map<String, Object> facts) {
System.out.println("注解驱动的规则执行");
}
}
运行结果示例
=== 开始执行规则 ===
用户被列入黑名单,禁止下单
订单金额超过1000元,享受9折优惠
VIP会员额外享受5%折扣
库存验证通过,可以继续下单
=== 执行结果 ===
执行的规则数量: 4
是否被阻止: true
折扣金额: 75.0
库存可用: true
最终金额: 1425.0
这个规则引擎案例展示了:
- 核心设计模式:模板方法模式、策略模式
- 灵活性:规则可以动态注册和移除
- 可扩展性:支持复合规则和条件规则
- 配置驱动:支持JSON等配置方式
- 优先级控制:可以控制规则执行顺序
您可以根据实际需求扩展这个基础框架,比如添加规则冲突处理、规则动态更新、规则执行的监控统计等功能。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播