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.
フレームの特徴
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を印刷します.そうしないと、印刷数字自体はルールエンジンを使用しません.
Easy Ruleを使用してMaven依存を追加するには、次の手順に従います.
定義FizzRule入力がfizzかどうかをチェック@Ruleはnameとdescriptionのプロパティをマークできます.各ruleのnameは一意で、指定されていない場合、RuleProxyはクラス名 をデフォルトで取得します.@Conditionは条件判定であり、boolean値を返すことを要求し、条件 を満たすか否かを示す.@Action表記条件成立後にトリガーする方法 @Priorityはruleの優先度を表示し、デフォルトはIntegerです.MAX_VALUE-1、値が小さいほど優先 BuzzRule
入力がbuzzかどうかを確認
FizzBuzzRule
入力がfizzbuzzであるかどうかを確認します.これはFizzRuleとBuzzRuleからなる組合せルールです.
NonFizzBuzzRule
実行
作者:孙成酱子说リンク:https://www.jianshu.com/p/a8f1c3b789f2出典:簡書簡書の著作権は著者の所有であり、いかなる形式の転載も著者に連絡して授権を得て出典を明記してください.
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;
}
}
入力が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出典:簡書簡書の著作権は著者の所有であり、いかなる形式の転載も著者に連絡して授権を得て出典を明記してください.