文章整理了 一些看到的文章 和 官方文档的一些东西。
大多数web和企业Java应用可以分成三个部分:一个和用户交互的前台, 一个和后台系统,例如数据库交互的服务层,以及他们中间的业务逻辑。 现在使用框架构建前台和后台系统已经成为普遍共识(例如, Struts, Cocoon, Spring, Hibernate, JDO, 和 Entity Beans), 但却没有一个标准的方法来构建业务逻辑。一些框架,例如 EJB 和 Spring 只在一个高层实现业务逻辑,但对于我们组织逻辑代码没有任何帮助,所以,为什么没有一个框架来替换冗繁,易错的if...then语句呢,这个框架应该和其它前台或后台框架一样,易于配置,具有可读性和重用性。下面我们将介绍Drools 规则引擎,这个来解决我们问题的框架。
我们经常能见到噩梦般的业务逻辑代码:
if ((user.isMemberOf(AdministratorGroup)&& user.isMemberOf(teleworkerGroup))|| user.isSuperUser(){
// more checks for specific cases
if((expenseRequest.code().equals("B203")||(expenseRequest.code().equals("A903")&&(totalExpenses<200)&&(bossSignOff> totalExpenses))&&(deptBudget.notExceeded)) {
//issue payments
} else if {
//check lots of other conditions
}
} else {
// even more business logic
}
当然会有一些优秀的程序员可以写出更漂亮些的代码,但那是相当费神的。而Drools等规则引擎 提供了一种很好的解决途径。
先来看Drools的一个简单的例子:
应用:某公司要对某一次参与生产的员工计算工资。
工资=产量*基本工资*系数
系数与该员工的产品合格率有关: 合格率=1 系数=1;0.9<=合格率<1 系数=0.95 ;0.85<=合格率<9 系数=0.9;0.8<=合格率<0.85 系数=0.8;合格率<0.8 系数=0.6;
假设我们有这么一个类:
上面应用用Drools的drl 应该这样描述:
这样就把业务逻辑和程序分开来了。如果要修改业务逻辑,那也是很容易的,只要修改Rule文件就可以了,而Rule文件是可以在一种类似XML的独立文件,可以很方便的替换修改。
大多数web和企业Java应用可以分成三个部分:一个和用户交互的前台, 一个和后台系统,例如数据库交互的服务层,以及他们中间的业务逻辑。 现在使用框架构建前台和后台系统已经成为普遍共识(例如, Struts, Cocoon, Spring, Hibernate, JDO, 和 Entity Beans), 但却没有一个标准的方法来构建业务逻辑。一些框架,例如 EJB 和 Spring 只在一个高层实现业务逻辑,但对于我们组织逻辑代码没有任何帮助,所以,为什么没有一个框架来替换冗繁,易错的if...then语句呢,这个框架应该和其它前台或后台框架一样,易于配置,具有可读性和重用性。下面我们将介绍Drools 规则引擎,这个来解决我们问题的框架。
我们经常能见到噩梦般的业务逻辑代码:
if ((user.isMemberOf(AdministratorGroup)&& user.isMemberOf(teleworkerGroup))|| user.isSuperUser(){
// more checks for specific cases
if((expenseRequest.code().equals("B203")||(expenseRequest.code().equals("A903")&&(totalExpenses<200)&&(bossSignOff> totalExpenses))&&(deptBudget.notExceeded)) {
//issue payments
} else if {
//check lots of other conditions
}
} else {
// even more business logic
}
当然会有一些优秀的程序员可以写出更漂亮些的代码,但那是相当费神的。而Drools等规则引擎 提供了一种很好的解决途径。
先来看Drools的一个简单的例子:
应用:某公司要对某一次参与生产的员工计算工资。
工资=产量*基本工资*系数
系数与该员工的产品合格率有关: 合格率=1 系数=1;0.9<=合格率<1 系数=0.95 ;0.85<=合格率<9 系数=0.9;0.8<=合格率<0.85 系数=0.8;合格率<0.8 系数=0.6;
假设我们有这么一个类:
public class Employee {
private String name;
private int product;
private float hgl;
...
}
上面应用用Drools的drl 应该这样描述:
rule "FirstGz"
when
e:Employee(hgl==1);
then
System.out.println(e.getName()+"的工资:"+e.getProduct()*50*1);
end
rule "SecondGz"
when
e:Employee(hgl<1,hgl>=0.9);
then
System.out.println(e.getName()+"的工资:"+e.getProduct()*50*0.95);
retract(e);
end
rule "3Gz"
when
e:Employee(hgl<0.9,hgl>=0.85);
then
System.out.println(e.getName()+"的工资:"+e.getProduct()*50*0.9);
retract(e);
end
rule "4Gz"
when
e:Employee(hgl<0.85,hgl>=0.8);
then
System.out.println(e.getName()+"的工资:"+e.getProduct()*50*0.85);
retract(e);
end
rule "5Gz"
when
e:Employee(hgl<0.8);
then
System.out.println(e.getName()+"的工资:"+e.getProduct()*50*0.6);
retract(e);
end
这样就把业务逻辑和程序分开来了。如果要修改业务逻辑,那也是很容易的,只要修改Rule文件就可以了,而Rule文件是可以在一种类似XML的独立文件,可以很方便的替换修改。