日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java規(guī)則引擎Easy Rules的使用介紹

瀏覽:12日期:2022-08-31 10:14:43

1. Easy Rules 概述

Easy Rules是一個Java規(guī)則引擎,靈感來自一篇名為《Should I use a Rules Engine?》的文章

規(guī)則引擎就是提供一種可選的計算模型。與通常的命令式模型(由帶有條件和循環(huán)的命令依次組成)不同,規(guī)則引擎基于生產(chǎn)規(guī)則系統(tǒng)。這是一組生產(chǎn)規(guī)則,每條規(guī)則都有一個條件(condition)和一個動作(action)———— 簡單地說,可以將其看作是一組if-then語句。

精妙之處在于規(guī)則可以按任何順序編寫,引擎會決定何時使用對順序有意義的任何方式來計算它們。考慮它的一個好方法是系統(tǒng)運行所有規(guī)則,選擇條件成立的規(guī)則,然后執(zhí)行相應(yīng)的操作。這樣做的好處是,很多問題都很自然地符合這個模型:

if car.owner.hasCellPhone then premium += 100;if car.model.theftRating > 4 then premium += 200;if car.owner.livesInDodgyArea && car.model.theftRating > 2 then premium += 300;

規(guī)則引擎是一種工具,它使得這種計算模型編程變得更容易。它可能是一個完整的開發(fā)環(huán)境,或者一個可以在傳統(tǒng)平臺上工作的框架。生產(chǎn)規(guī)則計算模型最適合僅解決一部分計算問題,因此規(guī)則引擎可以更好地嵌入到較大的系統(tǒng)中。

你可以自己構(gòu)建一個簡單的規(guī)則引擎。你所需要做的就是創(chuàng)建一組帶有條件和動作的對象,將它們存儲在一個集合中,然后遍歷它們以評估條件并執(zhí)行這些動作。

Easy Rules它提供Rule抽象以創(chuàng)建具有條件和動作的規(guī)則,并提供RuleEngine API,該API通過一組規(guī)則運行以評估條件并執(zhí)行動作。

Easy Rules簡單易用,只需兩步:

首先,定義規(guī)則,方式有很多種

方式一:注解

@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!'); }}

方式二:鏈?zhǔn)骄幊?/p>

Rule 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();

方式三:表達式

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!');');

方式四:yml配置文件

例如:weather-rule.yml

name: 'weather rule'description: 'if it rains then take an umbrella'condition: 'rain == true'actions: - 'System.out.println('It rains, take an umbrella!');'

MVELRuleFactory ruleFactory = new MVELRuleFactory(new YamlRuleDefinitionReader());Rule weatherRule = ruleFactory.createRule(new FileReader('weather-rule.yml'));

接下來,應(yīng)用規(guī)則

public class Test { public static void main(String[] args) { // define facts Facts facts = new Facts(); facts.put('rain', true); // define rules Rule weatherRule = ... Rules rules = new Rules(); rules.register(weatherRule); // fire rules on known facts RulesEngine rulesEngine = new DefaultRulesEngine(); rulesEngine.fire(rules, facts); }}

入門案例:Hello Easy Rules

<dependency> <groupId>org.jeasy</groupId> <artifactId>easy-rules-core</artifactId> <version>4.0.0</version></dependency>

通過骨架創(chuàng)建maven項目:

mvn archetype:generate -DarchetypeGroupId=org.jeasy -DarchetypeArtifactId=easy-rules-archetype -DarchetypeVersion=4.0.0

默認(rèn)給我們生成了一個HelloWorldRule規(guī)則,如下:

package com.cjs.example.rules;import org.jeasy.rules.annotation.Action;import org.jeasy.rules.annotation.Condition;import org.jeasy.rules.annotation.Rule;@Rule(name = 'Hello World rule', description = 'Always say hello world')public class HelloWorldRule { @Condition public boolean when() { return true; } @Action public void then() throws Exception { System.out.println('hello world'); }}

Java規(guī)則引擎Easy Rules的使用介紹

2. 規(guī)則定義

2.1. 定義規(guī)則

大多數(shù)業(yè)務(wù)規(guī)則可以用以下定義表示:

Name : 一個命名空間下的唯一的規(guī)則名稱 Description : 規(guī)則的簡要描述 Priority : 相對于其他規(guī)則的優(yōu)先級 Facts : 事實,可立即為要處理的數(shù)據(jù) Conditions : 為了應(yīng)用規(guī)則而必須滿足的一組條件 Actions : 當(dāng)條件滿足時執(zhí)行的一組動作

Easy Rules為每個關(guān)鍵點提供了一個抽象來定義業(yè)務(wù)規(guī)則。

在Easy Rules中,Rule接口代表規(guī)則

public interface Rule { /** * This method encapsulates the rule’s conditions. * @return true if the rule should be applied given the provided facts, false otherwise */ boolean evaluate(Facts facts); /** * This method encapsulates the rule’s actions. * @throws Exception if an error occurs during actions performing */ void execute(Facts facts) throws Exception; //Getters and setters for rule name, description and priority omitted.}

evaluate方法封裝了必須計算結(jié)果為TRUE才能觸發(fā)規(guī)則的條件。execute方法封裝了在滿足規(guī)則條件時應(yīng)該執(zhí)行的動作。條件和操作由Condition和Action接口表示。

定義規(guī)則有兩種方式:

通過在POJO類上添加注解 通過RuleBuilder API編程

可以在一個POJO類上添加@Rule注解,例如:

@Rule(name = 'my rule', description = 'my rule description', priority = 1)public class MyRule { @Condition public boolean when(@Fact('fact') fact) { //my rule conditions return true; } @Action(order = 1) public void then(Facts facts) throws Exception { //my actions } @Action(order = 2) public void finally() throws Exception { //my final actions }}

@Condition注解指定規(guī)則條件@Fact注解指定參數(shù)@Action注解指定規(guī)則執(zhí)行的動作

RuleBuilder支持鏈?zhǔn)斤L(fēng)格定義規(guī)則,例如:

Rule rule = new RuleBuilder().name('myRule').description('myRuleDescription').priority(3).when(condition).then(action1).then(action2).build();

組合規(guī)則

CompositeRule由一組規(guī)則組成。這是一個典型地組合設(shè)計模式的實現(xiàn)。

組合規(guī)則是一個抽象概念,因為可以以不同方式觸發(fā)組合規(guī)則。

Easy Rules自帶三種CompositeRule實現(xiàn):

UnitRuleGroup : 要么應(yīng)用所有規(guī)則,要么不應(yīng)用任何規(guī)則(AND邏輯) ActivationRuleGroup : 它觸發(fā)第一個適用規(guī)則,并忽略組中的其他規(guī)則(XOR邏輯) ConditionalRuleGroup : 如果具有最高優(yōu)先級的規(guī)則計算結(jié)果為true,則觸發(fā)其余規(guī)則

復(fù)合規(guī)則可以從基本規(guī)則創(chuàng)建并注冊為常規(guī)規(guī)則:

//Create a composite rule from two primitive rulesUnitRuleGroup myUnitRuleGroup = new UnitRuleGroup('myUnitRuleGroup', 'unit of myRule1 and myRule2');myUnitRuleGroup.addRule(myRule1);myUnitRuleGroup.addRule(myRule2);//Register the composite rule as a regular ruleRules rules = new Rules();rules.register(myUnitRuleGroup);RulesEngine rulesEngine = new DefaultRulesEngine();rulesEngine.fire(rules, someFacts);

每個規(guī)則都有優(yōu)先級。它代表觸發(fā)注冊規(guī)則的默認(rèn)順序。默認(rèn)情況下,較低的值表示較高的優(yōu)先級。可以重寫compareTo方法以提供自定義優(yōu)先級策略。

2.2. 定義事實

在Easy Rules中,F(xiàn)act API代表事實

public class Fact<T> { private final String name; private final T value;}

Java規(guī)則引擎Easy Rules的使用介紹

舉個栗子:

Fact<String> fact = new Fact('foo', 'bar');Facts facts = new Facts();facts.add(fact);

或者,也可以用這樣簡寫形式

Facts facts = new Facts();facts.put('foo', 'bar');

用@Fact注解可以將Facts注入到condition和action方法中

@Ruleclass WeatherRule { @Condition public boolean itRains(@Fact('rain') boolean rain) { return rain; } @Action public void takeAnUmbrella(Facts facts) { System.out.println('It rains, take an umbrella!'); // can add/remove/modify facts }}

2.3. 定義規(guī)則引擎

Easy Rules提供兩種RulesEngine接口實現(xiàn):

DefaultRulesEngine : 根據(jù)規(guī)則的自然順序應(yīng)用規(guī)則 InferenceRulesEngine : 持續(xù)對已知事實應(yīng)用規(guī)則,直到不再適用任何規(guī)則為止

創(chuàng)建規(guī)則引擎:

RulesEngine rulesEngine = new DefaultRulesEngine();// orRulesEngine rulesEngine = new InferenceRulesEngine();

然后,注冊規(guī)則

rulesEngine.fire(rules, facts);

規(guī)則引擎有一些可配置的參數(shù),如下圖所示:

Java規(guī)則引擎Easy Rules的使用介紹

舉個栗子:

RulesEngineParameters parameters = new RulesEngineParameters() .rulePriorityThreshold(10) .skipOnFirstAppliedRule(true) .skipOnFirstFailedRule(true) .skipOnFirstNonTriggeredRule(true);RulesEngine rulesEngine = new DefaultRulesEngine(parameters);

2.4. 定義規(guī)則監(jiān)聽器

通過實現(xiàn)RuleListener接口

public interface RuleListener { /** * Triggered before the evaluation of a rule. * * @param rule being evaluated * @param facts known before evaluating the rule * @return true if the rule should be evaluated, false otherwise */ default boolean beforeEvaluate(Rule rule, Facts facts) { return true; } /** * Triggered after the evaluation of a rule. * * @param rule that has been evaluated * @param facts known after evaluating the rule * @param evaluationResult true if the rule evaluated to true, false otherwise */ default void afterEvaluate(Rule rule, Facts facts, boolean evaluationResult) { } /** * Triggered on condition evaluation error due to any runtime exception. * * @param rule that has been evaluated * @param facts known while evaluating the rule * @param exception that happened while attempting to evaluate the condition. */ default void onEvaluationError(Rule rule, Facts facts, Exception exception) { } /** * Triggered before the execution of a rule. * * @param rule the current rule * @param facts known facts before executing the rule */ default void beforeExecute(Rule rule, Facts facts) { } /** * Triggered after a rule has been executed successfully. * * @param rule the current rule * @param facts known facts after executing the rule */ default void onSuccess(Rule rule, Facts facts) { } /** * Triggered after a rule has failed. * * @param rule the current rule * @param facts known facts after executing the rule * @param exception the exception thrown when attempting to execute the rule */ default void onFailure(Rule rule, Facts facts, Exception exception) { }}

3. 示例

<project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd'> <modelVersion>4.0.0</modelVersion> <groupId>com.cjs.example</groupId> <artifactId>easy-rules-quickstart</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.jeasy</groupId> <artifactId>easy-rules-core</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.jeasy</groupId> <artifactId>easy-rules-support</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.jeasy</groupId> <artifactId>easy-rules-mvel</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.30</version> </dependency> </dependencies></project>

Java規(guī)則引擎Easy Rules的使用介紹

4. 擴展

規(guī)則本質(zhì)上是一個函數(shù),如y=f(x1,x2,..,xn)

規(guī)則引擎就是為了解決業(yè)務(wù)代碼和業(yè)務(wù)規(guī)則分離的引擎,是一種嵌入在應(yīng)用程序中的組件,實現(xiàn)了將業(yè)務(wù)決策從應(yīng)用程序代碼中分離。

還有一種常見的方式是Java+Groovy來實現(xiàn),Java內(nèi)嵌Groovy腳本引擎進行業(yè)務(wù)規(guī)則剝離。

https://github.com/j-easy/easy-rules/wiki

到此這篇關(guān)于Java規(guī)則引擎Easy Rules的使用介紹的文章就介紹到這了,更多相關(guān)Java規(guī)則引擎Easy Rules內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品一区二区三区中文| 91精品综合| 久久在线电影| 国产精品久久久久9999高清| 日韩二区三区四区| 日韩av中文字幕一区二区| 天堂va蜜桃一区二区三区| 日韩午夜电影| 伊人久久婷婷| 亚洲中午字幕| 亚洲丝袜美腿一区| 日韩美女国产精品| 国产精品久久久久久妇女| 国语精品一区| 日本精品不卡| 国产综合精品| 亚洲深爱激情| 一区二区精品| 亚洲三区欧美一区国产二区| 日韩在线电影| 久久不见久久见中文字幕免费| 成人免费网站www网站高清| 亚洲一级特黄| 日韩一区精品视频| 日韩三级一区| 久久福利在线| 亲子伦视频一区二区三区| 欧美天堂亚洲电影院在线观看| 免费成人性网站| 国产精品一区三区在线观看| 丁香婷婷久久| 国精品一区二区| 亚洲精品护士| 欧美综合精品| 国产精品成人a在线观看| 久久美女性网| 日韩和欧美的一区| 日韩精品欧美激情一区二区| 在线一区二区三区视频| 精品国内亚洲2022精品成人| 一区二区小说| 欧美日韩亚洲一区三区| 亚洲1234区| 综合国产视频| 伊人网在线播放| 日韩精品一区二区三区av| 国产精品99视频| 综合激情一区| 福利一区和二区| 免费精品视频在线| 国精品产品一区| 蜜臀a∨国产成人精品| 精品视频亚洲| 在线看片日韩| 蜜臀av亚洲一区中文字幕| 精品国产一区二| 国产伦精品一区二区三区视频| 久久精品系列| 亚洲我射av| 亚洲国产福利| 亚洲2区在线| 欧洲一级精品| 国产精品香蕉| 久久九九精品| 久久国内精品自在自线400部| 91精品福利| 最近高清中文在线字幕在线观看1| 91精品国产自产观看在线 | 国产精品www994| 毛片不卡一区二区| 色狠狠一区二区三区| 伊人精品视频| 久久久国产精品一区二区中文| 国产精品亚洲综合久久| 亚洲一区二区网站| 日韩成人综合| 国产精品115| 五月亚洲婷婷 | 日韩国产欧美一区二区三区| 精品一区三区| 亚洲一级高清| 欧美天堂视频| 久久三级毛片| 欧美片第1页综合| 日韩高清在线不卡| 最新亚洲国产| 丝袜诱惑制服诱惑色一区在线观看 | 欧美亚洲色图校园春色| 午夜精品影院| 日韩欧美三级| 精品不卡一区| 亚洲欧美日本视频在线观看| 久久蜜桃av| 欧美日韩视频免费观看| 极品av在线| 成人污污视频| 亚洲精品免费观看| 日韩精品电影一区亚洲| 一本综合精品| 亚洲香蕉视频| 日韩精品导航| 国产精品一级在线观看| 国产精品一区二区三区av麻| 日韩va欧美va亚洲va久久| 欧美在线日韩| 美女在线视频一区| 国产+成+人+亚洲欧洲在线| 97精品国产福利一区二区三区| 国产一区二区三区四区二区| 日韩精品中文字幕第1页| 日韩大片在线观看| 91精品婷婷色在线观看| 免费毛片在线不卡| 鲁大师成人一区二区三区| 鲁大师影院一区二区三区| 免费一级片91| 亚洲欧洲国产精品一区| 久久国产视频网| 国产精品videossex| 日韩av片子| 欧美 日韩 国产精品免费观看| 久久亚洲二区| 国产日本亚洲| 精品一级视频| 日本精品在线中文字幕| 欧美精选一区二区三区| 午夜欧美精品| 日韩中文字幕不卡| 欧美日韩亚洲一区| 国产精品66| 蜜臀国产一区| 亚洲一区区二区| 日本精品在线播放| а√天堂8资源在线| 国产精品av久久久久久麻豆网| 日韩在线一区二区| 欧美黑人巨大videos精品| 亚洲1234区| 午夜精品影视国产一区在线麻豆| 精品三区视频| 亚洲自啪免费| 国产毛片久久久| 99久久夜色精品国产亚洲狼| 亚洲综合婷婷| 麻豆视频在线观看免费网站黄| 亚洲激情社区| 日本精品久久| 久久精品不卡| 国产精品美女午夜爽爽| 国产韩日影视精品| 国产日韩欧美三区| 亚洲国产影院| 欧美国产另类| 亚洲欧美日韩国产综合精品二区 | 日韩av二区在线播放| 日韩国产一二三区| 日韩视频网站在线观看| 日韩高清不卡一区二区| 999久久久精品国产| 欧美一区自拍| 亚洲经典在线| 精品三级av在线导航| 免费成人av在线播放| 日韩在线中文| 国产日韩欧美高清免费| 国产亚洲在线| 成人在线视频中文字幕| 亚洲有吗中文字幕| 99精品网站| 国产精品66| 中文字幕一区二区三区日韩精品| 日韩欧美国产精品综合嫩v| 国产精品一区三区在线观看| 亚洲一区免费| 国户精品久久久久久久久久久不卡| 麻豆一区在线| 91亚洲精品视频在线观看 | 五月天久久网站| 97精品国产一区二区三区| 久久精品 人人爱| 国产精品老牛| 999精品一区| 日本美女一区| 91免费精品| 国产精品115| 欧美亚洲福利| 日本一区二区中文字幕| 亚洲人妖在线| 美女久久一区| 午夜国产精品视频| 久久亚洲专区| 日韩欧美一区二区三区免费观看| 国产一区二区亚洲| 麻豆视频观看网址久久| 91亚洲无吗| 亚洲精品第一| 久久香蕉精品| 蜜臀va亚洲va欧美va天堂 | 成人国产精品久久| 精品一区二区三区的国产在线观看|