上一篇文章《QLExpress规则演进(三)规则引擎的变量》我们介绍了变量,这里我们介绍下规则引擎的自定义功能,首先我们再来回忆下之前的演示规则:
如果 年龄 大于等于 18 并且 性别 等于 "男" 那么 "用戶已成年" 否则 "用户未成年"
在这里我们的name后面跟的是字符串,否则后面也是字符串,所以对于字符串来说,默认是被return的,在真实的环境中,这里的那么和否则这两个后面一般都会跟一些方法,或者去数据库查询什么的。而不是简单的返回,那这时候怎么做呢?这就是这篇文章提到的自定义功能。
在QLExpress中,自定义功能很简单,所有的功能我们都可以使用java代码直接写就可以了,然后在运行的时候指定下遇到什么函数就执行什么功能。下面分别介绍下:
一、实现一个自定义功能
这里的自定义功能,其实可以理解成就是某个类的某个方法,例如这里我们实现一个直接返回字符串的功能。
/**
* 实现一个自定义的功能
*
* @param str
* @return
*/
public String outPrint(String str) {
// 这里我们直接把参数进行返回,在真实环境中,我们一般会涉及到查数据库,或者做其他的什么操作。
System.out.println("方法受到参数: " + str);
return str;
}上面我们就简单的实现了一个功能,在规则引擎运行的时候直接指定相关的函数对应的功能即可,例如:
runner.addFunctionOfClassMethod("输出", QLExpressDemo.class.getName(), "outPrint", new String[] { "String" }, null);当然还有一点变化,就是在规则里面我们尽量使用 功能+括号的形式,然后对应的参数都写在括号里面去。例如:
输出("未成年")这个时候在括号里面的信息就会自动被作为变量参数传入到自定义的function里面。下面展示一个完整的案例。
一、定义规则
如果
年龄 大于等于 18 并且 性别 等于 "男"
那么
输出("用戶已成年")
否则
输出("用户未成年")二、自定义一个输出function
public String outPrint(String str) {
System.out.println("方法受到参数: "+str);
return str;
}三、完整的规则案例
package com.qlexpress.demo;
import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
public class QLExpressDemo1 {
public static void main(String[] args) throws Exception {
String express3 = "如果\r\n"
+ " 年龄 大于等于 18\r\n"
+ "那么\r\n"
+ " 输出(\"成年\"\r\n)"
+ "否则\r\n"
+ " 输出(\"未成年\")";
ExpressRunner runner = new ExpressRunner();
runner.addFunctionOfClassMethod("输出", QLExpressDemo1.class.getName(), "outPrint", new String[] { "String" }, null);
runner.addOperatorWithAlias("如果", "if", null);
runner.addOperatorWithAlias("那么", "then", null);
runner.addOperatorWithAlias("否则", "else", null);
runner.addOperatorWithAlias("大于", ">", null);
runner.addOperatorWithAlias("大于等于", ">=", null);
runner.addOperatorWithAlias("小于", "<", null);
runner.addOperatorWithAlias("小于等于", "<", null);
DefaultContext<String, Object> context = new DefaultContext<String, Object>();
context.put("年龄", 18);
Object r = runner.execute(express3, context, null, true, false);
System.out.println(r);
}
/**
* 实现一个自定义的功能
*
* @param str
* @return
*/
public String outPrint(String str) {
// 这里我们直接把参数进行返回,在真实环境中,我们一般会涉及到查数据库,或者做其他的什么操作。
System.out.println("方法受到参数: " + str);
return str;
}
}四、运行测试下
可以看到已经成功的运行了。
备注:
1、在真实的环境中,这里自定义功能会涉及到一些比较复杂的业务,例如:查询数据库,统计数据等其他操作。
2、在自定义功能里面,我们把想要的结果直接通过逻辑处理完毕之后,再return出去即可。


还没有评论,来说两句吧...