我们在写业务代码时,总会遇到一大堆的 if/else,而大量的分支语句会为代码维护带来不少麻烦,代码的可读性差,将来需要添加或修改逻辑时也十分不便。有没有什么方法可以避免大量判断语句呢?答案是使用规则引擎。Easy Rules,这个轻量级、傻瓜式的规则引擎,十分值得推荐。

java如何写规则引擎 java规则框架_java如何写规则引擎

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 等表达式语言定义规则。

java如何写规则引擎 java规则框架_java如何写规则引擎

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(一直执行直到没有可用的规则),且接受包括优先级阈值等的参数。

java如何写规则引擎 java规则框架_java如何写规则引擎

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 项目。