第 5 章 事实模型(对象模型)
驱动基于规则的应用程序的规则需要事实模型(Fact Model)。事实模型通常和应用程序的域模型(domain model)重叠,但它应该从中分离,这从长远来说使得规则易于管理。
有两种定义事实模型的方法:
- 上传包含应用程序和规则使用的 Java 类的
JAR
文件。 - 在 BRMS 里声明的模型可以作为 KnowledgeBase 导出并用在 Java 代码里。
5.1. 全局区域(Global Area) 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
当创建事实模型时,它们可以导入将使用它们的特定软件包里,或者导入到全局区域(Global Area)里。请注意 Global Area 里的资产并不是对全局可用的,它们仍然必须导入到使用它们的软件包里。对于还未使用的资产,Global Area 应该用作一个存储位置,而对于用在多个软件包里的资产,它应该用作一个中心位置。
注意
当编辑位于软件包以及全局区域(Global Area)里的资产时需要很小心。在 Global Area 里编辑的资产将需要再次导入到使用它们的软件包里,而之前导入的资产将被删除。
5.2. JAR 模型 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
过程 5.1. 创建 JAR 模型
打开 New model archive (jar) 菜单
从 Knowledge Bases 菜单里,选择 Create New,然后选择 Upload POJO Model JAR。创建 JAR 模型资产
输入 JAR 模型的名字、类别和描述。选择模型所在的软件包或指定它应该添加到 Global Area 里。输入完毕后点击 OK。上传 JAR 到资产里
上传包含定义为常规 JAR 文件里的 Java 类和软件包的 JAR。
5.3. 声明式模型(Declarative Model) 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
使用声明式模型(Declarative Model)有如下好处:
- 它强调模型属于知识库,标注应用程序。
- 这个模型可以有独立于应用程序的生命周期。
- 规则专有的注解可以丰富 Java 类型。
- JAR 文件必须在规则和使用它的应用程序之间保持同步,然而,声明式模型不需要保持同步。
声明式模型可以是:
- 你的规则里使用的整个事实模型的独立定义。
- 支持 Java POJO 模型的补充性事实定义。
过程 5.2. 创建声明式模型
打开 New Declarative Model 菜单
从 Knowledge Bases 菜单,选择 Create New,然后选择 New Declarative Model。创建一个新的声明式模型
指定新模型的名称。选择创建模型的软件包或者指定它是否应该添加到 Global Area。输入完毕后点击 OK。定义模型
点击 Add new fact type 并在弹出菜单的 name 字段输入事实的名称。添加事实字段
通过选择 Add field 按钮并在弹出菜单里输入信息来创建事实字段(Fact Field),添加注解
选择 Add annotation 按钮来创建事实注解。注解的Name 和 Value 字段都是强制的,但 Key 字段是可选的。如果没有指定 Key 值,它将被分配Value
的一个缺省值。
5.3.1. 在 Java 里消费声明式模型 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
声明式类型是在知识库编译时生成的,因此应用程序只能在运行时访问它们。所以,应用程序不能直接引用这些类。
声明式类型可以象普通的事实对象一样使用,但你创建它们的方式会不一样(因为它们没有位于应用程序的 classpath 上)。要创建这些对象,它们可通过 KnowledgeBase 实例来进行。
例 5.1. 通过 API 处理声明的事实类型
注意
声明的类型的命名空间是它所在的软件包的命名空间(在上面的例子里是
org.drools.examples
)。