使用规则执行器替换java中if语句
干掉 if else,让代码容易扩展
在公众号(链接:https://mp.weixin.qq.com/s/33S0KgZuGjddwY9gyAa1Iw)中看到这样一个规则执行器用来替换掉大量的if语句,本想在本地coding一遍学习学习,发现有一些可以优化的东西,特地记录一下。
1.首先
2.用户基类
3.规则校验基类
4.用户信息校验规则基类
5.用户校验规则实现类,这里我写了两个,分别校验(UserInfo.addr是否以北京开头)和(UserInfo.age>=18)
6.最重要的规则实现类
public class RuleService<T> {
private Map<Integer, List<? extends BaseRule<T>>> RULES = new HashMap<>();
private T entity;
private static final int AND = 1;
private static final int OR = 0;
public static <G> RuleService<G> create(G g) {
RuleService<G> ruleService = new RuleService<>();
ruleService.entity = g;
return ruleService;
}
public RuleService<T> and(List<? extends BaseRule<T>> rules) {
RULES.put(AND, rules);
return this;
}
public RuleService<T> or(List<? extends BaseRule<T>> rules) {
RULES.put(OR, rules);
return this;
}
public Boolean execute() {
for (Map.Entry<Integer, List<? extends BaseRule<T>>> entry : RULES.entrySet()) {
List<? extends BaseRule<T>> rules = entry.getValue();
switch (entry.getKey()) {
case AND:
if (!and(entity, rules)) {
return false;
}
break;
case OR:
if (!or(entity,rules)) {
return false;
}
break;
default:
break;
}
}
return true;
}
private boolean or(T entity, List<? extends BaseRule<T>> rules) {
for (BaseRule<T> rule : rules) {
if (rule.execute(entity)) {
return true;
}
}
return false;
}
private boolean and(T entity, List<? extends BaseRule<T>> rules) {
for (BaseRule<T> rule : rules) {
if (!rule.execute(entity)) {
return false;
}
}
return true;
}
}