美文网首页
类似策略模式 替代if else

类似策略模式 替代if else

作者: 程序男保姆 | 来源:发表于2021-06-25 14:37 被阅读0次
    
    
    @Data
    public class RuleDto {
    
        private String address;
        private int age;
    
    }
    
    
    
    public interface BaseRule {
        /***
         * 执行方法
         * @param dto
         * @return
         */
        boolean execute(RuleDto dto);
    }
    
    
    
    
    public abstract class AbstractRule implements BaseRule{
    
        protected <T> T convert(RuleDto dto){
            return (T)dto;
        };
    
        @Override
        public boolean execute(RuleDto dto){
    
            return executeRule(convert(dto));
        }
    
        protected  <T> boolean executeRule(T t){
            return true;
        };
    
    }
    
    
    
    
    public class AddressRule extends AbstractRule{
    
        @Override
        protected <T> boolean executeRule(T t) {
    
            RuleDto dto = (RuleDto) t;
    
    
            if (dto.getAddress().startsWith("a")){
                return true;
            }
            return false;
        }
    
    }
    
    
    
    
    public class AgeRule extends AbstractRule{
    
    
        @Override
        protected <T> T convert(RuleDto dto) {
    
           return super.convert(dto);
        }
    
        @Override
        public boolean execute(RuleDto dto) {
    
            System.out.println("AgeRule rule ");
    
            if (dto.getAge() > 10){
                return true;
            }
            return false;
    
        }
    }
    
    
    
    public class RuleService {
    
        private Map<Integer, List<BaseRule>> hashMap = new HashMap<>();
        private static final int AND = 1;
        private static final int OR = 0;
    
        public static RuleService create() {
            return new 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 boolean execute(RuleDto dto) {
    
            boolean allMatch = hashMap.entrySet().stream()
                    .allMatch(entry -> {
                        Integer key = entry.getKey();
                        List<BaseRule> value = entry.getValue();
    
                        switch (key) {
                            case AND: {
                                // 如果是and关系 同步执行
                                if (!and(dto, value)) {
                                    return false;
                                }
                                break;
                            }
                            case OR: {
                                // 如果是or关系 并行执行
                                if (!or(dto, value)) {
                                    return false;
                                }
                                break;
                            }
                            default: {
                                break;
                            }
                        }
                        return true;
                    });
    
            return allMatch;
        }
    
    
        private boolean and(RuleDto dto, List<BaseRule> ruleList) {
            // 只要有一个是返回false 的  就返回false
            boolean execute = ruleList.stream()
                    .allMatch(baseRule -> baseRule.execute(dto));
            return execute;
        }
    
    
        private boolean or(RuleDto dto, List<BaseRule> ruleList) {
            // 只要有一个是返回true 的  就返回true
            boolean execute = ruleList.stream()
                    .anyMatch(baseRule -> baseRule.execute(dto));
            return execute;
        }
    
    
    }
    
    
    
    
    public class T {
    
        public static void main(String[] args) {
    
            BaseRule ageRule = new AgeRule();
            BaseRule addressRule = new AddressRule();
    
            RuleDto ruleDto = new RuleDto();
            ruleDto.setAddress("abcd");
            ruleDto.setAge(12);
    
            boolean execute = RuleService.create()
                    .and(Arrays.asList(addressRule))
                    .or(Arrays.asList(ageRule))
                    .execute(ruleDto);
    
    
            System.out.println(execute);
    
    
        }
    
    }
    
    
    

    相关文章

      网友评论

          本文标题:类似策略模式 替代if else

          本文链接:https://www.haomeiwen.com/subject/skhoyltx.html