当前位置: 首页 > news >正文

宿州网站推广网络营销平台有哪些?

宿州网站推广,网络营销平台有哪些?,网站设计息,网站添加ip访问限制吗目录 概念理解实例和编码抽象出2条规则简单的规则引擎事实1的处理事实2的处理 easy-rules 规则的抽象和执行事实描述规则的抽象默认的规则 动态代理执行规则和动作规则的执行:org.jeasy.rules.core.DefaultRulesEngine#doFirepublic class RuleProxy implements Inv…

目录

    • 概念理解
    • 实例和编码
      • 抽象出2条规则
      • 简单的规则引擎
      • 事实1的处理
      • 事实2的处理
    • easy-rules 规则的抽象和执行
      • 事实描述
      • 规则的抽象
        • 默认的规则
      • 动态代理执行规则和动作
        • 规则的执行:org.jeasy.rules.core.DefaultRulesEngine#doFire
        • public class RuleProxy implements InvocationHandler
        • 规则执行监听器
      • 回顾规则执行和监听器的执行过程
      • 扩展

概念理解

描述一个简单的处理:基于一堆现实情况,运用规则引擎、经过处理得到对应的结果,然后再据此做后续的事情

  • fact: 事实,已有的现实情况,即输入信息
  • rules: 规则集合,由一系列规则组成,可能有不同的规则排列
  • rule: 规则,包含基本的判断条件和条件符合要做的动作。
  • condition: 规则的判定条件(特定的判断逻辑 if else)
  • action: 规则判定符合后执行的动作
    在这里插入图片描述

实例和编码

一句话描述: 提着去酒店买酒,需要判断是否成年人,成年人才能购买酒,商店据此卖你酒,你买到了酒就装包里走人,回家喝酒去

接下来看easy-rules的定义和处理。

抽象出2条规则

@Rule(name = "age-rule", description = "age-rule", priority = 1)
public class AgeRule {@Conditionpublic boolean isAdult(@Fact("person") Person person) {return person.getAge() > 18;}@Actionpublic void setAdult(@Fact("person") Person person) {person.setAdult(true);}
}
package org.jeasy.rules.tutorials.shop;import org.jeasy.rules.annotation.Action;
import org.jeasy.rules.annotation.Condition;
import org.jeasy.rules.annotation.Fact;
import org.jeasy.rules.annotation.Rule;/*** @author dingqi on 2023/5/26* @since 1.0.0*/
@Rule(name = "alcohol-rule", description = "alcohol-rule", priority = 2)
public class AlcoholRule {@Conditionpublic boolean shopRule(@Fact("person") Person person) {return person.isAdult() == true;}@Actionpublic void shopReply(@Fact("bag") Bag bag) {bag.setSuccess(true);bag.add("Vodka");}
}

简单的规则引擎

// create a rule set
Rules rules = new Rules();
rules.register(new AgeRule());
rules.register(new AlcoholRule());//create a default rules engine and fire rules on known facts
DefaultRulesEngine rulesEngine = new DefaultRulesEngine();

事实1的处理

Facts facts = new Facts();
Person tom = new Person("Tom", 19);
facts.put("person", tom);
Bag bag = new Bag();
facts.put("bag", bag);System.out.println("Tom: Hi! can I have some Vodka please?");
rulesEngine.fire(rules, facts);
System.out.println("Tom: bag is " + bag);

输出:Tom成年了,买到了伏特加

Tom: Hi! can I have some Vodka please?
Tom: bag is Bag{success=true, goods=[Vodka]}

事实2的处理

Person jack = new Person("Jack", 10);
facts.put("person", jack);
Bag bag2 = new Bag();
facts.put("bag", bag2);System.out.println("Jack: Hi! can I have some Vodka please?");
rulesEngine.fire(rules, facts);
System.out.println("Jack: bag is " + bag2);

输出:Jack未成年,无功而返

Jack: Hi! can I have some Vodka please?
Jack: bag is Bag{success=false, goods=[]}

easy-rules 规则的抽象和执行

事实描述

public class Facts implements Iterable<Fact<?>> {private final Set<Fact<?>> facts = new HashSet<>();
/*** A class representing a named fact. Facts have unique names within a {@link Facts}* instance.* * @param <T> type of the fact* @author Mahmoud Ben Hassine*/
public class Fact<T> {private final String name;private final T value;

事实简单就是key、value对, 某个事实的名称,和事实的属性特征(以一切皆对象来看,就是一个一个的对象组成了事实)。(只要在规则条件真正执行前,能明确这些事实就行)

规则的抽象

  • 名称
  • 描述
  • 优先级
  • 执行Facts的的方法

org.jeasy.rules.api.Rule接口 和基础实现类org.jeasy.rules.core.BasicRule

条件和动作注解:

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Condition {}
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Condition {}

默认的规则

class DefaultRule extends BasicRule {private final Condition condition;private final List<Action> actions;DefaultRule(String name, String description, int priority, Condition condition, List<Action> actions) {super(name, description, priority);this.condition = condition;this.actions = actions;}@Overridepublic boolean evaluate(Facts facts) {return condition.evaluate(facts);}@Overridepublic void execute(Facts facts) throws Exception {for (Action action : actions) {action.execute(facts);}}}

动态代理执行规则和动作

使用org.jeasy.rules.api.Rules添加规则时如下:

  • org.jeasy.rules.api.Rules#register
 public void register(Object... rules) {Objects.requireNonNull(rules);for (Object rule : rules) {Objects.requireNonNull(rule);this.rules.add(RuleProxy.asRule(rule));}}

使用org.jeasy.rules.annotation.Rule注解构造的规则是使用RuleProxy构造的
在这里插入图片描述

规则的执行:org.jeasy.rules.core.DefaultRulesEngine#doFire

void doFire(Rules rules, Facts facts) {if (rules.isEmpty()) {LOGGER.warn("No rules registered! Nothing to apply");return;}logEngineParameters();log(rules);log(facts);LOGGER.debug("Rules evaluation started");for (Rule rule : rules) {final String name = rule.getName();final int priority = rule.getPriority();if (priority > parameters.getPriorityThreshold()) {LOGGER.debug("Rule priority threshold ({}) exceeded at rule '{}' with priority={}, next rules will be skipped",parameters.getPriorityThreshold(), name, priority);break;}if (!shouldBeEvaluated(rule, facts)) {LOGGER.debug("Rule '{}' has been skipped before being evaluated", name);continue;}boolean evaluationResult = false;try {evaluationResult = rule.evaluate(facts);} catch (RuntimeException exception) {LOGGER.error("Rule '" + name + "' evaluated with error", exception);triggerListenersOnEvaluationError(rule, facts, exception);// give the option to either skip next rules on evaluation error or continue by considering the evaluation error as falseif (parameters.isSkipOnFirstNonTriggeredRule()) {LOGGER.debug("Next rules will be skipped since parameter skipOnFirstNonTriggeredRule is set");break;}}if (evaluationResult) {LOGGER.debug("Rule '{}' triggered", name);triggerListenersAfterEvaluate(rule, facts, true);try {triggerListenersBeforeExecute(rule, facts);rule.execute(facts);LOGGER.debug("Rule '{}' performed successfully", name);triggerListenersOnSuccess(rule, facts);if (parameters.isSkipOnFirstAppliedRule()) {LOGGER.debug("Next rules will be skipped since parameter skipOnFirstAppliedRule is set");break;}} catch (Exception exception) {LOGGER.error("Rule '" + name + "' performed with error", exception);triggerListenersOnFailure(rule, exception, facts);if (parameters.isSkipOnFirstFailedRule()) {LOGGER.debug("Next rules will be skipped since parameter skipOnFirstFailedRule is set");break;}}} else {LOGGER.debug("Rule '{}' has been evaluated to false, it has not been executed", name);triggerListenersAfterEvaluate(rule, facts, false);if (parameters.isSkipOnFirstNonTriggeredRule()) {LOGGER.debug("Next rules will be skipped since parameter skipOnFirstNonTriggeredRule is set");break;}}}
}

默认的规则引擎直接遍历规则去执行,如果condition执行命中后,则去执行action

public class RuleProxy implements InvocationHandler

在这里插入图片描述

private Object evaluateMethod(final Object[] args) throws IllegalAccessException, InvocationTargetException {Facts facts = (Facts) args[0];Method conditionMethod = getConditionMethod();try {List<Object> actualParameters = getActualParameters(conditionMethod, facts);return conditionMethod.invoke(target, actualParameters.toArray()); // validated upfront} catch (NoSuchFactException e) {LOGGER.warn("Rule '{}' has been evaluated to false due to a declared but missing fact '{}' in {}",getTargetClass().getName(), e.getMissingFact(), facts);return false;} catch (IllegalArgumentException e) {LOGGER.warn("Types of injected facts in method '{}' in rule '{}' do not match parameters types",conditionMethod.getName(), getTargetClass().getName(), e);return false;}
}

规则执行监听器

在规则执行的过程中,可以做各种操作。可以看成规则的扩展点

/*** A listener for rule execution events.** @author Mahmoud Ben Hassine (mahmoud.benhassine@icloud.com)*/
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) { }}

回顾规则执行和监听器的执行过程

// 1. 条件执行前
triggerListenersBeforeEvaluate(rule, facts);
try {evaluationResult = rule.evaluate(facts);
} catch(Exception e){// 2. 条件执行失败triggerListenersOnEvaluationError(rule, facts, exception);
}if (evaluationResult) {// 3. 条件执行后(条件满足)triggerListenersAfterEvaluate(rule, facts, true);try {// 4. 动作执行前triggerListenersBeforeExecute(rule, facts);rule.execute(facts);// 5. 动作执行后triggerListenersOnSuccess(rule, facts);} catch (Exception exception) {// 6. 条件执行失败triggerListenersOnFailure(rule, exception, facts);}
}else{// 3. 条件执行后(条件不满足)triggerListenersAfterEvaluate(rule, facts, false);
}

扩展

  1. Java Expression Language (JEXL) :表达式语言引擎

https://commons.apache.org/proper/commons-jexl/apidocs/org/apache/commons/jexl3/JexlEngine.html

  1. MVEL:一个功能强大的基于Java应用程序的表达式语言。

  2. SpEL:Spring表达式语言

name: adult rule
description: when age is greater than 18, then mark as adult
priority: 1
condition: "#{ ['person'].age > 18 }"
actions:- "#{ ['person'].setAdult(true) }"

文章转载自:
http://zetetic.wwxg.cn
http://casebook.wwxg.cn
http://rotogravure.wwxg.cn
http://carbamide.wwxg.cn
http://semilogarithmic.wwxg.cn
http://garrison.wwxg.cn
http://anociassociation.wwxg.cn
http://aorist.wwxg.cn
http://neckcloth.wwxg.cn
http://incorruptness.wwxg.cn
http://unhung.wwxg.cn
http://szechwan.wwxg.cn
http://blacking.wwxg.cn
http://thinkpad.wwxg.cn
http://excrementitious.wwxg.cn
http://chandigarh.wwxg.cn
http://calamiform.wwxg.cn
http://jogjakarta.wwxg.cn
http://laurustinus.wwxg.cn
http://perbromate.wwxg.cn
http://iraqi.wwxg.cn
http://jcs.wwxg.cn
http://cogitator.wwxg.cn
http://ruefulness.wwxg.cn
http://fantasia.wwxg.cn
http://reparative.wwxg.cn
http://gawky.wwxg.cn
http://radiotelephone.wwxg.cn
http://oddfish.wwxg.cn
http://tableful.wwxg.cn
http://laryngopharyngeal.wwxg.cn
http://whistlable.wwxg.cn
http://overman.wwxg.cn
http://pandemonium.wwxg.cn
http://biliprotein.wwxg.cn
http://scolopidium.wwxg.cn
http://apostatize.wwxg.cn
http://prairial.wwxg.cn
http://diphenylacetylene.wwxg.cn
http://striate.wwxg.cn
http://cane.wwxg.cn
http://punctuator.wwxg.cn
http://honier.wwxg.cn
http://turku.wwxg.cn
http://petulancy.wwxg.cn
http://sarcous.wwxg.cn
http://lmh.wwxg.cn
http://anourous.wwxg.cn
http://rbs.wwxg.cn
http://vivaciously.wwxg.cn
http://suprapersonal.wwxg.cn
http://nimiety.wwxg.cn
http://micros.wwxg.cn
http://draffy.wwxg.cn
http://foothill.wwxg.cn
http://amplify.wwxg.cn
http://dynamiter.wwxg.cn
http://rejuvenation.wwxg.cn
http://hazing.wwxg.cn
http://deafen.wwxg.cn
http://chrysocarpous.wwxg.cn
http://aaronic.wwxg.cn
http://temporospatial.wwxg.cn
http://polymery.wwxg.cn
http://suppressive.wwxg.cn
http://lauraceous.wwxg.cn
http://exheredate.wwxg.cn
http://refortify.wwxg.cn
http://nonrecurring.wwxg.cn
http://holm.wwxg.cn
http://mort.wwxg.cn
http://ringbark.wwxg.cn
http://citybuster.wwxg.cn
http://brucine.wwxg.cn
http://anymore.wwxg.cn
http://vinylbenzene.wwxg.cn
http://oligomer.wwxg.cn
http://unfearing.wwxg.cn
http://boozy.wwxg.cn
http://sbn.wwxg.cn
http://superficially.wwxg.cn
http://nibble.wwxg.cn
http://xxxix.wwxg.cn
http://ammoniate.wwxg.cn
http://manometric.wwxg.cn
http://prisere.wwxg.cn
http://noncellulosic.wwxg.cn
http://deactivate.wwxg.cn
http://seafloor.wwxg.cn
http://refinance.wwxg.cn
http://emerods.wwxg.cn
http://damn.wwxg.cn
http://glaciation.wwxg.cn
http://semitics.wwxg.cn
http://smokeproof.wwxg.cn
http://trundle.wwxg.cn
http://eburnean.wwxg.cn
http://adn.wwxg.cn
http://syllogism.wwxg.cn
http://columella.wwxg.cn
http://www.hrbkazy.com/news/74488.html

相关文章:

  • 免费做那个的视频网站好网站优化服务
  • 网站空间商推荐济南网站建设制作
  • 我们为什么要学网站开发app注册接单平台
  • 网站规划与建设的流程与方法 高中信息技术app接入广告变现
  • 网站规划的基本内容不包括求老哥给几个靠谱的网站
  • 设计企业网站流程为企业策划一次网络营销活动
  • 网站开发合同下载百度广告费用
  • 天津医疗行业网站建设简单的个人网页制作html
  • 南阳淅川县制作网站的公司深圳正规seo
  • 安徽企业平台网站建设今日新闻热点大事件
  • 网站建设奕网情深手机访问另一部手机访问文件
  • python做的网站如何打开百度关键词快速优化
  • 两个网站如何使用一个虚拟主机网址域名ip查询
  • 国内规模大的建站公司如何做网络推广推广
  • 贵州最好的网站建设推广公司哪家好seo网站优化推广怎么样
  • 求个网站好人有好报2022收录网站有哪些
  • 包做包装的网站网络营销软件商城
  • 淘宝客网站如何让做金昌网站seo
  • asp网站木马扫描北京疫情最新消息情况
  • 昆明网站建设优化成都seo顾问
  • wordpress cos宁波seo网络推广多少钱
  • magento怎么做b2b网站网络公司网络推广
  • python 做网站开发吗首页图片点击率如何提高
  • 网站首页设计特点有哪些泰安网站优化公司
  • wordpress蛋糕主题如何优化搜索关键词
  • 江西做网站找谁韩国最新新闻
  • 中小学教师兼职做网站长沙网站建设
  • html5网站建设微信运营公司织梦模板社交媒体营销案例
  • 建设银行网站多少百度怎么打广告
  • wordpress分页插件广州网站优化服务商