当弄清楚了一个规则的设计和执行逻辑后,接下来需要考虑的就是许多的规则如何组织了,即规则集的抽象设计。
来看一些例子
普通的规则集合
使用TreeSet存储规则,具体是依靠规则的priority和name来排序存储到TreeSet中
回到规则的执行逻辑
见注释:
- 按照优先级遍历执行,会判断是否有跳过规则
- 规则执行,如果命中,则执行规则下的动作,同时判断是否要结束此次规则引擎的执行
- 规则引擎可以设定是否执行了一个规则命中就跳出整个执行
这已经符合大部分的规则逻辑和实际情况了:符合所有条件或者只需要某个条件就够了。
如何想规则集合的构造
以普通人的经历来说基本可以有两种规则组织
第一种规则:
- 九年义务教育,高中,大学,硕士,博士…
按照正常的流程走,优先级必须是这样,每一关都得关关过,过不了就止步了。当然有例外了:
- 天资聪慧的可以进行跳级,即有些关可以不用闯了,跳过(可以看成规则的跳过逻辑)
- 在每一关过后,可能家庭、学校、社会有些小奖励(可以看成规则命中后的动作)
第二种规则:
当步入社会后,比较复杂起来了, 都是一个一个十字路口,掺杂着一些平行线
规则错综复杂,像一棵树,而第一种规则也适用于其中的某些阶段。可以看成规则命中后的动作
而在计算机的世界中表示上述两种规则集的组织结构显然是线性结构和树形结构。
定义普通规则集和执行
对于普通的规则集执行,仍然可以堪称规则下的表达式执行一样:把规则堪称操作数,规则的结果进行or操作
RuleSet的抽象
普通的RuleSet
借用规则的执行逻辑,在规则集执行的时候: 遍历每一个规则,如果执行返回true,则后面会跳过执行,否则继续执行下一个
规则集测试执行
定义树形规则集
- DecisionTreeNode
树形结构规则集
- TreeRuleSet
在树形结构的执行过程中,如果遇到规则执行为命中,则可以表示规则集命中,当然如果有异常则有需要表示出来;同时也可以记录规则执行的路径,即属性结构的执行路径
树形结构的执行测试
如下: 按照的规则结构走下去