package com.easyooo.framework.rule; /** *<p>规则引擎接口定义,该接口中定义了执行规则所需要的方法, 具体规则语法及执行策略需要子类完成</p> *<p> * 在脚本中可以访问global、local两个变量根引用,global来自{@link #setContext(RuleContext)}的参数, * 而local也可以是RuleContext,但也可以是在调用{@link #eval(Rule, Object...)}时指定。 *</P> * * @author Killer */ public interface RuleEngine { /** * 执行规则之前,可为引擎设置全局上下文参数, * 全局上下文参数时针对引擎实例来说的, * 同一个引擎实例在任何一次执行都可以获取到上下文参数, * 相比调用eval所传入的局部变量,生命周期更长 * * @param context */ void setContext(RuleContext context); /** * 根据Rule定义执行脚本,脚本支持多种引擎 * @see Language * * 执行的脚本内容决定是否依赖于上下文,返回值也依赖于脚本内容 * 如果脚本内容无返回值,则返回null * @param rule * @return * @throws RuleException */ <T> T eval(Rule rule)throws RuleException; /** * 执行脚本,可传入局部变量,局部变量执行完成将会自动清理 * * @param rule * @param dataMap 局部变量表,如:eval(rule, "gift", gift, "goods", goods) * @return * @throws RuleException */ <T> T eval(Rule rule, Object... dataMap)throws RuleException; /** * 验证规则的语法 * @param rule * @return * @throws RuleException */ boolean verifySyntax(Rule rule)throws RuleException; }