JAVAルールエンジンのEasyRules

11760 ワード

ルールエンジンのEasyRules
EasyRulesとは
まずEasyRuleはルールエンジンですこの名前の由来はMartin Fowlerの文章Should I usea Rules Engineから
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 ones
実践-FizzBuzz
1~100を繰り返し印刷しますが、5の倍数であればfizz、7の倍数であればbuzz、5と7の倍数であればfizzzzを印刷します.そうしないと、印刷数字自体はルールエンジンを使用しません.
@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を使用してMaven依存を追加するには、次の手順に従います.
<dependency>
    <groupId>org.easyrulesgroupId>
    <artifactId>easyrules-coreartifactId>
    <version>2.4.0version>
dependency>

定義FizzRule入力がfizzかどうかをチェック
import org.easyrules.annotation.Action;
import org.easyrules.annotation.Condition;
import org.easyrules.annotation.Priority;
import org.easyrules.annotation.Rule;

@Rule  //   
public class FizzRule {

    private int input;

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

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

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

    @Priority  //    0/1/2/3.....         
    public int getPriority(){
        return 1;
    }
}
  • @Ruleはnameとdescriptionのプロパティをマークできます.各ruleのnameは一意で、指定されていない場合、RuleProxyはクラス名
  • をデフォルトで取得します.
  • @Conditionは条件判定であり、boolean値を返すことを要求し、条件
  • を満たすか否かを示す.
  • @Action表記条件成立後にトリガーする方法
  • @Priorityはruleの優先度を表示し、デフォルトはIntegerです.MAX_VALUE-1、値が小さいほど優先
  • BuzzRule
    入力がbuzzかどうかを確認
    import org.easyrules.annotation.Action;
    import org.easyrules.annotation.Condition;
    import org.easyrules.annotation.Priority;
    import org.easyrules.annotation.Rule;
    
    @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  //    0/1/2/3.....         
        public int getPriority() {
            return 2; 
            }
    }

    FizzBuzzRule
    入力がfizzbuzzであるかどうかを確認します.これはFizzRuleとBuzzRuleからなる組合せルールです.
    import org.easyrules.core.CompositeRule;
    
    public class FizzBuzzRule extends CompositeRule {
    
        public FizzBuzzRule(Object... rules) {
            for (Object rule : rules) {
                addRule(rule);
            }
        }
    
        @Override
        public int getPriority() {
            return 0;
        }
    }

    NonFizzBuzzRule
    import org.easyrules.annotation.Action;
    import org.easyrules.annotation.Condition;
    import org.easyrules.annotation.Priority;
    import org.easyrules.annotation.Rule;
    
    @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;
        }
    }

    実行
    import org.easyrules.api.RulesEngine;
    import org.easyrules.core.RulesEngineBuilder;
    
    public class FizzBuzzWihEasyRules {
        public static void main(String[] args) {
            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(nonFizzBuzzRule);
            // fire rules
            for (int i = 1; i <= 100; i++) {
                //    
                fizzRule.setInput(i);
                buzzRule.setInput(i);
                nonFizzBuzzRule.setInput(i);
                fizzBuzzEngine.fireRules();
                System.out.println();
            }
        }
    }

    作者:孙成酱子说リンク:https://www.jianshu.com/p/a8f1c3b789f2出典:簡書簡書の著作権は著者の所有であり、いかなる形式の転載も著者に連絡して授権を得て出典を明記してください.