35、Drools语法篇之类的声明及元数据的用法

其实之前有对 declare 做过一些说明 http://blog.csdn.net/u013115157/article/details/52025633
但只是简单的应用,和一些基本语法,在这一章节中,我将function函数的官方说明做一简单的阐述

类型声明 


在规则引擎中类型声明有两个目标:允许声明新类型;允许为类型声明元数据。
1、声明新类型:Drools 开箱即可操作纯 java 对象作为事实。然而,用户有时候可能希望直接 定义规则引擎的原型(model),不用担心象在 java 这样的低级语言中创建原型(models)。 在其他时候,已经构建了一个域原型,但是终端用户希望或需要使用另外的实体,主要是用 于推理过程期间的,而补充这个原型。

2、 声明元数据:事实可能有与之相关联的元信息。元信息的例子包括任何类型的数据,它们 并没有被事实的属性表现出来,而且在该事实类型的所有实例中是一致的。这些元信息在运 行时可以被引擎查询,并可以用于推理过程。

要声明一个新类型,你所做的事是使用关键字 declare,紧接着是字段列表,和关键字 end。
声明一个新的事实类型:Address
...
declare Address
    number : int
    streetName : String
    city : String
end
...

上面的例子声明了一个名为 Address 的新事实类型。这个事实类型将会有三个属性:number, streetName,city。每个属性的类型可以是任何有效的 java 类型,包括用户创建的任何其他类,甚至 可以是前面声明的事实类型。
例如,我们想声明另外一个事实类型 Person:
...
declare Person
    name : String
    dateOfBirth : java.util.Date
    address : Address       //这里就是上面的新事实类型了
end
...
正如我们在上面的例子所见,dateOfBirth 是 java.util.Date 类型,来自 Java API,而 address 是前面定 义的事实类型 Address

你可以使用 import 子句,避免每次编写时必须书写完全合格类名,如前所述:
使用 import 子句,避免必须使用完全合格类名
...
import java.util.Date

declare Person
    name : String
    dateOfBirth : Date
    address : Address
end
...

当你声明一个新事实类型时, Drools 会, 在编译时, 生成实现表示事实类型的一个 java 类的字节码。 生成的 java 类,将是一个一对一的 Java Bean 的类型定义的映射。所以,对于前面的例子,生成 的 java 类将会是

public class Person implements Serializable {
    private String name;
    private java.util.Date dateOfBirth;
    private Address address;
    // getters and setters   //此处省略这些方法。
    // equals/hashCode
    // toString
}
因为生成的类是一个简单的 java 类,它可以透明地用于规则中,就象任何其他的事实一样。是挺神奇的吧。
rule "Using a declared Type"
    when
        $p : Person( name == "Bob" )
    then
        // Insert Mark, who is Bob's mate.
        Person mark = new Person();
        mark.setName("Mark");
        insert( mark );
end

当在规则文件中创建的类与import引用的类名不同一个,则系统会报错,

 例如:
import com.jars1.jars1.Person;
declare
Person
    @author( Bob )
    @dateOfCreation( 01-Feb-2009 )
    name:String
    age:int
end
但如果是将其实看做是被引用的javabean,则不会报错,我们将上面的例子做一个修改
import com.jars1.jars1.Person;
declare Person
    @author( Bob )
    @dateOfCreation( 01-Feb-2009 )    
end
至于为什么这样不会报错,请到元数据的用法章节看一下就OK了
其实在规则文件中定义类,也是可以用继承的。 extends

declare Person enddeclare Student extends Person
    school : String
enddeclare LongTermStudent extends Student
    years : int
    course : String
end


从应用程序代码访问声明的类型
声明的类型通常用于规则文件内部,而 java 原型被用于规则和应用程序之间共享原型时。虽然,有 时候,应用程序需要根据声明的类型访问和处理事实,特别是应用程序包装了规则引擎,为规则的管 理提供了更高级的、域特殊用户接口时。
在这种情况下,生成的类可以象通常使用 Java Reflection API 进行处理,但是,正如我们所知一样, 小结果也需要做大量的工作。因此,Drools 为应用程序想做的最普通的事实处理提供了一个简化的 API。

首先要意识到的重要事情是 声明的事实将属于声明它的包。所以,例如,在下面的例子中,Person 将 属于 org.drools.examples 包,故生成的类的完全合格名字为 org.drools.examples.Person

在 org.drools.examples 包中声明一个类型
package org.drools.examples
import java.util.Date
declare Person
    name : String
    dateOfBirth : Date
    address : Address
end

声明的类型,如前所述,在知识库编译时产生,即,应用程序在应用运行时才能访问它们。因此,这 些类不能直接从应用程序引用。 所以,Drools 提供了一个接口,通过它用户可以从应用程序代码处理它们:
//得到一个引用一个知识库声明类型:
KnowledgeBase kbase = ...
// 得到宣布FactType
FactType personType = kbase.getFactType( "org.drools.examples","Person" );
// handle the type as necessary: 处理类型是必要的: 
Object bob = personType.newInstance();
personType.set( bob,"name","Bob" );
personType.set( bob,"age",42 );
//获取ksession 执行
StatefulKnowledgeSession ksession = ...
ksession.insert( bob );
ksession.fireAllRules(); 
String name = personType.get( bob, "name" );
int age = personType.get( bob, "age" );

该 API 也包括其他有用的方法,例如一次性设置所有属性,从一个 Map 中读取值,一次性读取所有 属性值到一个 Map 中。
尽管这个 API 相似于 Java reflection (但使用上更简单),它在底层并没有使用反射(reflection), 依赖于实现产生字节码的高性能访问器。

下面是小编的微信转帐二维码,小编再次谢谢读者的支持,小编会更努力的

----请看下方↓↓↓↓↓↓↓

百度搜索 Drools从入门到精通:可下载开源全套Drools教程

深度Drools教程不段更新中:


更多Drools实战陆续发布中………

扫描下方二维码关注公众号 ↓↓↓↓↓↓↓↓↓↓




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值