请 // 规则执行器 public class RuleService { private Map<Integer, List<BaseRule>> hashMap = new HashMap<>(); private static final int NOT = 2; private static final int AND = 1; private static final int OR = 0; private RuleDto ruleDto; public static RuleService create(RuleDto ruleDto) { RuleService ruleService = new RuleService(); ruleService.ruleDto = ruleDto; return ruleService; } public RuleService and(List<BaseRule> ruleList) { hashMap.put(AND, ruleList); return this; } public RuleService or(List<BaseRule> ruleList) { hashMap.put(OR, ruleList); return this; } public RuleService not(List<BaseRule> ruleList) { hashMap.put(NOT, ruleList); return this; } public boolean execute() { return this.execute(ruleDto); } private boolean execute(RuleDto dto) { for (Map.Entry<Integer, List<BaseRule>> item : hashMap.entrySet()) { List<BaseRule> ruleList = item.getValue(); switch (item.getKey()) { case AND: // 如果是 and 关系,同步执行 System.out.println("execute key = " + 1); if (!andRule(dto, ruleList)) { return false; } break; case OR: // 如果是 or 关系,并行执行 System.out.println("execute key = " + 0); if (!orRule(dto, ruleList)) { return false; } break; case NOT: // 如果是 not 关系 System.out.println("execute key = " + 2); if (!notRule(dto, ruleList)) { return false; } default: break; } } return true; } private boolean andRule(RuleDto dto, List<BaseRule> ruleList) { for (BaseRule rule : ruleList) { boolean execute = rule.execute(dto); if (!execute) { // and 关系匹配失败一次,返回 false return false; } } // and 关系全部匹配成功,返回 true return true; } private boolean orRule(RuleDto dto, List<BaseRule> ruleList) { for (BaseRule rule : ruleList) { boolean execute = rule.execute(dto); if (execute) { // or 关系匹配到一个就返回 true return true; } } // or 关系一个都匹配不到就返回 false return false; } private boolean notRule(RuleDto dto, List<BaseRule> ruleList) { // not 规则内部为 and 链接 return !andRule(dto, ruleList); } } // 规则工厂类 public class RuleServices { /** * 学生规则教研 * * @return */ public static RuleService isValidStudent(RuleDto ruleDto) { AgeRule ageRule = new AgeRule(); NameRule nameRule = new NameRule(); NationalityRule nationalityRule = new NationalityRule(); AddressRule addressRule = new AddressRule(); SubjectRule subjectRule = new SubjectRule(); Flag110Rule flag110Rule = new Flag110Rule(); return RuleService .create(ruleDto) .and(Arrays.asList(nationalityRule, nameRule, addressRule)) .or(Arrays.asList(ageRule, subjectRule)) .not(Collections.singletonList(flag110Rule)); } } |