为什么要使用规则引擎?

来源:互联网 发布:淘宝香水正品店 编辑:程序博客网 时间:2024/05/29 17:03

首先当面临一个逻辑稍微复杂的业务处理时,经常会过多的使用if… else if…else 这样的语句,我们容易陷入自己的逻辑混乱当中,而且可调试性和可维护性非常差。这时候我们就会想能不能把业务逻辑抽象出来,用一种简单易懂的语言来描述。这时候规则引擎就出现了。使用规则引擎主要有以下几个优点:

1)               声明式的编程:这种方式使得逻辑变得清晰易懂,而且对复杂问题的描述也变得简单化。

2)               逻辑与数据分离:数据保存在系统对象中,逻辑保存在规则中。这根本性的打破了面向对象系统中将数据和逻辑耦合起来的局面,这点是有利的也是不利的,在于你的观察角度。这样做的结果是,将来逻辑发生改变时更容易被维护,因为逻辑保存在规则中。这点在逻辑是跨领域或多领域中使用时尤其有用。通过将逻辑集中在一个或数个清晰的规则文件中,取代了之前分散在代码中的局面。

3)      速度及可测量性 : Rete算法、Leaps算法,以及由此衍生出来的 Drools的 Rete、Leaps算法,提供了对系统数据对象非常有效率的匹配。这些都是高效率尤其当你的数据是不完全的改变(规则引擎能够记得之前的匹配)。这些算法经过了大量实际考验的证明。

而Drools是实现规则引擎的一个很优秀的框架。

 

2.      规则引擎中规则如何定义?

 

我觉得很多书籍一开始就讲原理、内部的实现机制等等,而我比较喜欢先阅读如何将它运行起来,然后再接着学习它是如何是实现的,这样学习起来会更加的快捷,而且一开始也不会那么枯燥。先看一个规则定义的例子:

下面的规则定义表示的是当一个人进入到一个房间(isComing==true),同时同一个房间内(roomId==$p.getRoomId())温度小于20°(temperature<20)时,触发一个事件(在这个情况下是输出一条语句)。

Xml代码 复制代码 收藏代码
  1. rule "PE Rules"   
  2.     when   
  3.         #conditions    
  4.         $p:PeopleEvent(isComing==true)   
  5.         $t:TemperatureEvent(temperature<20roomId==$p.getRoomId())   
  6.     then   
  7.         #actions   
  8.       System.out.println("/******Situmulate the condition******/");   
  9. end   
rule "PE Rules"    when        #conditions         $p:PeopleEvent(isComing==true)        $t:TemperatureEvent(temperature<20, roomId==$p.getRoomId())    then        #actions      System.out.println("/******Situmulate the condition******/");end

          这个就是一个简单规则的定义,相信大家都能看出when后面跟的是判断的逻辑,then后面跟的是条件都满足时触发的事件。其中在when中实现了一些表达式的判断,与逻辑(在中的对象。当然Drools在规则定义中还提供了很多强大的功能,我们将在后面对几个比较重要的定义方式进行介绍。

          有了规则之后,我们希望能输入一些事情来测试一下这个规则是否能满足我们的需求。下面的代码中触发了这条规则 :

原创粉丝点击