用来处理大量的if 的判断逻辑,其包含and 与or的穿插使用
public interface BaseRule<T> {
/**
* 规则执行主方法
* @param entity
* @return
*/
Boolean execute(T entity);
}
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> service = new RuleService<>();
service.entity = g;
return service;
}
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 and(T entity,List<? extends BaseRule<T>> rules){
for (BaseRule<T> rule : rules) {
if (!rule.execute(entity)) {
return false;
}
}
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;
}
}