流程中比较重要的第二个点就是条件判定,流程有了,如果条件判定不行,流程照样执行不下去。理解条件判定在执行过程中是比较重要的,在开发和排查错误中可以有效的减少我们的时间,提升销量
条件判断
条件判断的方式有很多种,最终都可以总结为
- 等于
- 大于
- 小于
- 包含
- 不包含
等等上述的几个关系。
在简单判定中可能只有一种,例如金额小于10元可以直接报销,大于10元需要老板审批。
而在复杂判定中,则是由多个简单判定组合而成的,他们的组合条件是 或者 以及 并且 来组合多个简单判定。
example:
<domain><model trigger="first"><rule><case><condition operator="and"><if var="name" relation="=" value="{userName}"/><if var="sex" relation="=" value="男"/></condition><effect prob="1"><set var="u_m" value="你的性别是: {sex} 姓名是:{name}"/></effect></case><case><effect prob="1"><set var="u_m" value="请输入你的姓名和性别哟!"/></effect></case></rule></model></domain>
这个例子逻辑不太恰当,也可以说明提交判定的方式了
- 如果输入的变量
name等于 输入的userName并且 性别sex=男- 那么将
你的性别是: {sex} 姓名是:{name}赋值给u_m变量
- 那么将
- 否则执行第二个case,由于第二个case没有condition,则一定会执行
- 那么将
请输入你的姓名和性别哟!赋值给u_m变量
- 那么将
判定的方式就是这么简单,下面看看代码是如何去组织这一段的。
源码分析

条件的描述使用接口,分别有一下几个实现
- BasicCondtion 上边罗列的几个判断方式,例如等于,不等于等等
- VoidCondition 空判定,总是为true,同编程语言中 else 后边的部分。
- ComplexConditon 复杂条件,有多个Condition组合而成,多个条件之间的组合关系为
AND和OR - NegatedCondtion 否定,用的较少。
BasicCondtion
一个基础的条件判断,就是预期的值和实际的值进行比较判定
- realValue
- expectValue
Opendial 的处理方式与此相同
- 提供上下文的变量信息
- 根据初始化的上下文决定是否需要填槽 ,如果出现
{}就意味着是一个占位符,需要进行填槽处理,其实就是做一次replace 将realValue和expectValue进行对比
@Overridepublic boolean isSatisfiedBy(Assignment input) {//是否支持进行比较了,如果还有槽需要填,是不能进行比较的if (!variable.isFilledBy(input) || !templateValue.isFilledBy(input)) {return false;}BasicCondition grounded = new BasicCondition(this, input);//从上下文中获取变量variable真实的数据Value actualValue = input.getValue(grounded.variable.toString());//进行比较return grounded.isSatisfied(actualValue);}//----------------------------------------------------------------/*** Returns true if the relation is satisfied between the actual and expected* values.** @param actualValue the actual value* @return true if satisfied, false otherwise*/private boolean isSatisfied(Value actualValue) {// standard caseif (groundValue != null) {switch (relation) {case EQUAL:return actualValue.equals(groundValue);case UNEQUAL:return !actualValue.equals(groundValue);case GREATER_THAN:return (actualValue.compareTo(groundValue) > 0);case LOWER_THAN:return (actualValue.compareTo(groundValue) < 0);case CONTAINS:return actualValue.contains(groundValue);case NOT_CONTAINS:return !actualValue.contains(groundValue);case LENGTH:return actualValue.length() == groundValue.length();case IN:return groundValue.contains(actualValue);case NOT_IN:return !groundValue.contains(actualValue);}return false;}// when regular expressions in the templateselse {switch (relation) {case EQUAL:return templateValue.match(actualValue.toString()).isMatching();case UNEQUAL:return !templateValue.match(actualValue.toString()).isMatching();case CONTAINS:return templateValue.partialmatch(actualValue.toString()).isMatching();case NOT_CONTAINS:return !templateValue.partialmatch(actualValue.toString()).isMatching();case LENGTH:return templateValue.match("" + actualValue.length()).isMatching();default:return false;}}}
ComplexConditon
ComplexCondition 代表复杂条件,等同于多个List的组合实现
- 如果是AND,所有Condition都要满足
- 如果是OR,只要满足其中一个即可
@Overridepublic boolean isSatisfiedBy(Assignment input) {for (Condition cond : subconditions) {if (operator == BinaryOperator.AND && !cond.isSatisfiedBy(input)) {return false;}else if (operator == BinaryOperator.OR && cond.isSatisfiedBy(input)) {return true;}}return (operator == BinaryOperator.AND);}
总结
讲述了Condition是如何组成的,以及Condition的处理方式,没有涉及到变量提取是如何操作的。
