我们在写业务代码时,总会遇到一大堆的 if/else,而大量的分支语句会为代码维护带来不少麻烦,代码的可读性差,将来需要添加或修改逻辑时也十分不便。有没有什么方法可以避免大量判断语句呢?答案是使用规则引擎。Easy Rules,这个轻量级、傻瓜式的规则引擎,十分值得推荐。
Easy Rules - 傻瓜式的Java规则引擎-1.jpg (16.62 KB, 下载次数: 0)
2020-10-20 08:22 上传
条件语句if/else
简介
Easy Rules,是 j-easy 在Github 上开源的 Java 规则引擎,项目仓库在 https://github.com/j-easy/easy-rules,目前版本为 v4.0.0。Easy Rules 作为一个规则引擎库,
十分轻量,API容易上手;基于 POJO 开发,并使用了注解的编程模型;使用了抽象来定义业务规则,并能方便应用;能从基本规则创建组合规则;能使用如 MVEL 和 SpEL 等表达式语言定义规则。
Easy Rules - 傻瓜式的Java规则引擎-2.jpg (28.33 KB, 下载次数: 0)
2020-10-20 08:22 上传
规则引擎
安装
Easy Rules 目前版本为 4.0.0,基于 Java 8,使用 Maven 引入:
org.jeasy easy-rules-core 4.0.0示例
使用 Easy Rules,我们首先需要定义规则。Easy Rules 支持不同的规则定义方式,包括
注解@Rule(name = "weather rule", description = "if it rains then take an umbrella")public class WeatherRule { @Condition public boolean itRains(@Fact("rain") boolean rain) { return rain; } @Action public void takeAnUmbrella() { System.out.println("It rains, take an umbrella!"); }}
使用注解 Rule 定义了规则的名字和描述;使用 Condition 和 Fact 定义了一个条件,在这里是判断是否下雨;使用 Action 定义了规则对应的行动,这里是输出拿雨伞的消息提示。整个 WeatherRule 表达了一条规则:当下雨时提示拿雨伞。
Fluent APIRule weatherRule = new RuleBuilder() .name("weather rule") .description("if it rains then take an umbrella") .when(facts -> facts.get("rain").equals(true)) .then(facts -> System.out.println("It rains, take an umbrella!")) .build();
使用了 Fluent API 方式定义规则,依次定义了名字、描述、条件和行动,最后进行构建。
表达式语言Rule weatherRule = new MVELRule() .name("weather rule") .description("if it rains then take an umbrella") .when("rain == true") .then("System.out.println(\"It rains, take an umbrella!\");");
在这里,我们使用了 MVEL 表达式语言,把条件和行动以脚本的形式输入,完成了规则的定义。
YAML的规则描述器name: "weather rule"description: "if it rains then take an umbrella"condition: "rain == true"actions: - "System.out.println(\"It rains, take an umbrella!\");"
使用了额外的 YAML 配置文件 weather-rule.yml 进行了规则的描述,条件和行动都以表达式语言的脚本给出。然后在 Java 代码中进行规则的构建:
试试MVELRuleFactory ruleFactory = new MVELRuleFactory(new YamlRuleDefinitionReader());Rule weatherRule = ruleFactory.createRule(new FileReader("weather-rule.yml"));
这种方式分离了规则的描述和构建,使得后续的修改更为方便。
在完成了规则的定义后,我们就可以进行使用了。Easy Rules 的使用需要:事实集合(Facts)和规则集合(Rules),然后使用规则引擎,输入事实和规则,进行执行。
public class Test { public static void main(String[] args) { // 定义事实 Facts facts = new Facts(); facts.put("rain", true); // 定义规则 Rule weatherRule = ... Rules rules = new Rules(); rules.register(weatherRule); // 使用规则引擎执行 RulesEngine rulesEngine = new DefaultRulesEngine(); rulesEngine.fire(rules, facts); }}更多
规则的定义包括:名字、描述、优先级、事实集合、条件集合和行动集合,可以进行较为复杂的规则定义;Easy Rules 支持符合规则,模块 easy-rules-support 带有 3 种符合规则的实现,包括:UnitRuleGroup、ActivationRuleGroup 和 ConditionalRuleGroup;规则引擎包括两种实现:DefaultRulesEngine(以规则的自然顺序执行)和 InferenceRulesEngine(一直执行直到没有可用的规则),且接受包括优先级阈值等的参数。
Easy Rules - 傻瓜式的Java规则引擎-3.jpg (69.72 KB, 下载次数: 0)
2020-10-20 08:22 上传
条件语句 if/else
总结
Easy Rules,作为一个规则引擎,优化了代码中大量存在 if/else 的问题,为代码维护带来了许多好处。与其他 Java 的规则引擎相比,Easy Rules 十分轻量,API 设计非常简洁,上手极为简单,在小规模应用的场景中尤为适用。
Easy Rules 项目开发十分活跃,近来发布了新的大版本 4.0.0,提供了许多新的特性和提升。Easy Rules 代码质量高,注释详尽,文档丰富且提供了不少使用例子,是个值得学习和使用的优秀 Java 项目。