条件表达式扩展
条件表达式扩展
提示
- 当内置的条件表达式不满足业务需求时,可进行扩展
条件表达式扩展
1、表达式公共接口
ExpressionStrategy接口,是表达式策略类接口,抽离公共方法
- 1、
getType(): 表达式策略类型,也是表达式的前缀 - 2、
interceptStr(): 返回策略类型和真实表达式之间的分隔符,为空表示保留完整表达式;非空时会先移除getType() + interceptStr()再把剩余内容交给eval()执行 - 3、
eval(): 执行表达式 - 4、
setExpression(): 设置新增的表达式,方便扩展
/**
* 表达式策略类接口
*
* @author warm
*/
public interface ExpressionStrategy<T> {
/**
* 获取策略类型
*
* @return 类型
*/
String getType();
/**
* 返回策略类型和真实表达式之间的分隔符
* <p>
* 返回空字符串表示执行策略时保留完整表达式;返回非空时会先移除
* {@code getType() + interceptStr()},再把剩余内容交给 eval()。
*
* @return 表达式截取分隔符
*/
default String interceptStr() {
return "";
}
/**
* 执行表达式
*
* @param expression 表达式
* @param variable 流程变量
* @return 执行结果
*/
T eval(String expression, Map<String, Object> variable);
/**
* 设置表达式
* @param expressionStrategy 表达式
*/
void setExpression(ExpressionStrategy<T> expressionStrategy);
}2、注册表达式实现类
- 通过这个方法进行注册ExpressionUtil.setExpression
ExpressionUtil.setExpression(new ExpressionStrategyEq());3、条件表达式
- 扩展需要实现
ConditionStrategy接口,或者继承AbstractConditionStrategy抽象类
3.1、条件表达式接口
/**
* 流程条件表达式策略接口
*
* @author warm
*/
public interface ConditionStrategy extends ExpressionStrategy<Boolean> {
/**
* 条件表达式策略实现集合
* <p>
* ExpressionUtil 倒序遍历该集合,因此后注册的策略优先级更高
*/
List<ExpressionStrategy<Boolean>> EXPRESSION_STRATEGY_LIST = new ArrayList<>();
/**
* 注册条件表达式策略
*/
@Override
default void setExpression(ExpressionStrategy<Boolean> expressionStrategy) {
EXPRESSION_STRATEGY_LIST.add(expressionStrategy);
}
/**
* 条件表达式默认使用 @@ 分隔策略类型和表达式主体,如:eq@@flag|4
*/
@Override
default String interceptStr() {
return FlowCons.SPLIT_AT;
}
}3.2、条件表达式抽象类
/**
* 条件表达式抽象类,复用部分代码
*
* @author warm
*/
public abstract class AbstractConditionStrategy implements ConditionStrategy {
/**
* 执行表达式前置方法 合法性校验
*
* @param name 变量名称:flag
* @param variable 流程变量
*/
public void preEval(String name, Map<String, Object> variable) {
AssertUtil.isEmpty(variable, ExceptionCons.NULL_CONDITION_VALUE);
Object o = variable.get(name);
AssertUtil.isNull(o, ExceptionCons.NULL_CONDITION_VALUE);
}
/**
* 执行表达式
*
* @param expression 表达式:flag|4
* @param variable 流程变量
* @return 执行结果
*/
@Override
public Boolean eval(String expression, Map<String, Object> variable) {
String[] split = expression.split(FlowCons.SPLIT_VERTICAL);
preEval(split[0].trim(), variable);
String variableValue = String.valueOf(variable.get(split[0].trim()));
return afterEval(split[1].trim(), variableValue);
}
/**
* 执行表达式后置方法
*
* @param value 表达式最后一个参数,比如:eq@@flag|4 的 [4]
* @param variableValue 流程变量值
* @return 执行结果
*/
public abstract Boolean afterEval(String value, String variableValue);
}3.3、条件表达式实现类
/**
* 条件表达式等于 eq@@flag|4
*
* @author warm
*/
public class ConditionStrategyEq extends AbstractConditionStrategy {
@Override
public String getType() {
return ConditionType.EQ.getKey();
}
@Override
public Boolean afterEval(String value, String variableValue) {
if (MathUtil.isNumeric(value)) {
return MathUtil.determineSize(variableValue, value) == 0;
} else {
return variableValue.equals(value);
}
}
}