規則引擎及easyrules機制分析

1、什麼是規則引擎

最近在工做中,遇到一類上層業務規則多變的場景。因此研究了規則引擎相關的內容,在這裏能夠與你們一塊兒探討。規則引擎相關的概念和相關業內使用,能夠參考如下兩篇文章,分析的很到位,也指出了大致的方向和具體的實踐:html

《規則引擎概述》https://blog.csdn.net/express_wind/article/details/77141674java

《從0到1:構建強大且易用的規則引擎》https://tech.meituan.com/maze_framework.htmlgit

2、規則引擎實踐

    規則引擎的實現有比較多的開源組件,比較出名的是Drools,屬於重量級的實現。本文主要介紹一款輕量級的規則引擎實現:easyrulesgithub

一、什麼是EasyRules?

首先EasyRule是一個規則引擎.這個名字由來是受到了Martin Fowler 的文章 Should I use a Rules Engineexpress

You can build a simple rules engine yourself. All you need is to create a bunch of objects with conditions and actions, store them in a collection, and run through them to evaluate the conditions and execute the actions.編程

二、框架特色

  • 輕量級類庫和容易上手
  • 基於POJO的開發與註解的編程模型
  • 方便且適用於java的抽象的業務模型規則
  • 支持從簡單的規則建立組合規則

Useful abstractions to define business rules and apply them easily with Java
The ability to create composite rules from primitive onesapp

三、實踐-FizzBuzz

循環打印 1 到 100,但若是是 5 的倍數就印 fizz,若是是 7 的倍數就印 buzz,若是同時是 5 和 7 的倍數就印 fizzzuzz,不然打印數字自己框架

不使用規則引擎

@Test
public void fizzbuzz() {
    for(int i = 1; i <= 100; i++) {
      if (((i % 5) == 0) && ((i % 7) == 0))
        System.out.print("fizzbuzz");
      else if ((i % 5) == 0) System.out.print("fizz");
      else if ((i % 7) == 0) System.out.print("buzz");
      else System.out.print(i);
      System.out.println();
    }
    System.out.println();
  }

使用Easy Rule

定義FizzRule

檢查輸入是不是fizzide

@Rule
public class FizzRule {

    private int input;

    @Condition
    public boolean isFizz() {
        return input % 5 == 0;
    }

    @Action
    public void printFizz() {
        System.out.print("fizz");
    }

    public void setInput(int input) {
        this.input = input;
    }

    @Priority
    public int getPriority() {
        return 1;
    }
}

BuzzRule

檢查輸入是不是buzzui

@Rule
public class BuzzRule {

    private int input;

    @Condition
    public boolean isBuzz() {
        return input % 7 == 0;
    }

    @Action
    public void printBuzz() {
        System.out.print("buzz");
    }

    public void setInput(int input) {
        this.input = input;
    }

    @Priority
    public int getPriority() {
        return 2;
    }
}

FizzBuzzRule

檢查輸入是不是fizzbuzz,這是一個組合規則,它由FizzRule和BuzzRule組成

public class FizzBuzzRule extends CompositeRule {

    public FizzBuzzRule(Object... rules) {
        for (Object rule : rules) {
            addRule(rule);
        }
    }

    @Override
    public int getPriority() {
        return 0;
    }
}

NonFizzBuzzRule

@Rule
public class NonFizzBuzzRule {

    private int input;

    @Condition
    public boolean isNotFizzNorBuzz() {
        // can return true here
        return input % 5 != 0 || input % 7 != 0;
    }

    @Action
    public void printInput() {
        System.out.print(input);
    }

    public void setInput(int input) {
        this.input = input;
    }

    @Priority
    public int getPriority() {
        return 3;
    }
}

執行

public class FizzBuzzWithEasyRules {

    public static void main(String[] args) {

        // create rules engine
        RulesEngine fizzBuzzEngine =
         RulesEngineBuilder.aNewRulesEngine()
                .withSkipOnFirstAppliedRule(true) // 若是第一個規則知足條件,後面的規則將再也不執行
                .withSilentMode(true)
                .build();

        // create rules
        FizzRule fizzRule = new FizzRule();
        BuzzRule buzzRule = new BuzzRule();
        FizzBuzzRule fizzBuzzRule
            = new FizzBuzzRule(fizzRule, buzzRule);
        NonFizzBuzzRule nonFizzBuzzRule = new NonFizzBuzzRule();

        // register rules
        fizzBuzzEngine.registerRule(fizzRule);
        fizzBuzzEngine.registerRule(buzzRule);
        fizzBuzzEngine.registerRule(fizzBuzzRule);
        fizzBuzzEngine.registerRule(nonFizzBuzzRule);

        // fire rules
        for (int i = 1; i <= 100; i++) {
            fizzRule.setInput(i);
            buzzRule.setInput(i);
            nonFizzBuzzRule.setInput(i);
            fizzBuzzEngine.fireRules();
            System.out.println();
        }
    }
}

四、相關文檔

EasyRules Github

Easy Rules

參考文獻:https://www.jianshu.com/p/a8f1c3b789f2

相關文章
相關標籤/搜索