最近在工做中,遇到一類上層業務規則多變的場景。因此研究了規則引擎相關的內容,在這裏能夠與你們一塊兒探討。規則引擎相關的概念和相關業內使用,能夠參考如下兩篇文章,分析的很到位,也指出了大致的方向和具體的實踐:html
《規則引擎概述》https://blog.csdn.net/express_wind/article/details/77141674java
《從0到1:構建強大且易用的規則引擎》https://tech.meituan.com/maze_framework.htmlgit
規則引擎的實現有比較多的開源組件,比較出名的是Drools,屬於重量級的實現。本文主要介紹一款輕量級的規則引擎實現:easyrulesgithub
首先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.編程
Useful abstractions to define business rules and apply them easily with Java
The ability to create composite rules from primitive onesapp
循環打印 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(); }
檢查輸入是不是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; } }
檢查輸入是不是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; } }
檢查輸入是不是fizzbuzz,這是一個組合規則,它由FizzRule和BuzzRule組成
public class FizzBuzzRule extends CompositeRule { public FizzBuzzRule(Object... rules) { for (Object rule : rules) { addRule(rule); } } @Override public int getPriority() { return 0; } }
@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(); } } }