정책 모드 기반 플러그 가능 디자인2

4637 단어
전편에서 마지막으로 제기한 부족함에 대하여 다음과 같이 개선하였다.
  • Module Manager에spareStrategyName을 추가하면 예비 정책을 표시하고BaseStrategy에서spare를 제거하는 방법을 나타냅니다.변동은 비교적 간단하고 코드는 생략한다.
  • SingleAPImoduleStrategy 클래스를 추가하여 간단한 단일api 인터페이스로 진일보한 봉인SingleAPImoduleStrategy 코드는 다음과 같다
  • public abstract class SingleAPIModuleStrategy extends BaseStrategy {
    
        protected SupplyAPI api;
    
        protected JSONObject apiResponse;
    
        public SingleAPIModuleStrategy(Report report, SupplyAPIRepository supplyAPIRepository, APISearchRepository apiSearchRepository) {
            super(report, supplyAPIRepository, apiSearchRepository);
            setAPI();
        }
    
        protected abstract void setAPI();
    
        @Override
        public boolean isAPIActive() {
            return api.isActive() && isParameterComplete();
        }
    
        protected abstract boolean isParameterComplete();
    
        @Override
        public boolean isContainsAPI(Map pool) {
            return pool.containsKey(api.getCode());
        }
    
        @Override
        public boolean isAPIUnfinished(Map pool) {
            return EMPTY_JSON.equals(pool.get(api.getCode()));
        }
    
        @Override
        public void tryPutEmptyAPI(Map pool) {
            if (!pool.containsKey(api.getCode())) {
                pool.put(api.getCode(), EMPTY_JSON);
            }
        }
    
        @Override
        public void removeEmptyAPI(Map pool) {
            pool.remove(api.getCode());
        }
    
        @Override
        public void putAPIResponseIntoPool(Map pool) {
            if (apiResponse != null && !EMPTY_JSON.equals(apiResponse)) {
                pool.put(api.getCode(), apiResponse);
            }
        }
    }
    

    대응하는 FraudModuleStrategy의 예는 다음과 같다.
    public class FraudModuleStrategy extends SingleAPIModuleStrategy {
    
        private static final Logger logger = LoggerFactory.getLogger(FraudModuleStrategy.class);
    
        private final static long API_ID = 17L;
    
        public FraudModuleStrategy(Report report, SupplyAPIRepository supplyAPIRepository, APISearchRepository apiSearchRepository) {
            super(report, supplyAPIRepository, apiSearchRepository);
        }
    
        @Override
        protected void setAPI() {
            super.api = supplyAPIRepository.findOne(API_ID);
        }
    
        @Override
        protected boolean isParameterComplete() {
            return super.report.getCustomerName() != null && super.report.getCustomerIdCard() != null
                    && super.report.getCustomerMobile() != null;
        }
    
        @Override
        public boolean fetchData(Map pool) {
            JSONObject cacheData = pool.get(api.getCode());
            if (cacheData != null && !EMPTY_JSON.equals(cacheData)) {
                super.apiResponse = cacheData;
                return true;
            }
            API api = new API();
            api.setSupplyAPI(super.api);
            api.getParameters().put("name", super.report.getCustomerName());
            api.getParameters().put("idCard", super.report.getCustomerIdCard());
            api.getParameters().put("mobile", super.report.getCustomerMobile());
            if (!StringUtils.isEmpty(report.getCustomerBankCard())) {
                api.getParameters().put("bankCardNo", super.report.getCustomerBankCard());
            }
    
            cacheData = getCache(api);
            if (cacheData != null) {
                logger.info("    " + super.api.getCode());
            } else {
                logger.info("    " + super.api.getCode());
                XinShuCallable xinShuCallable = new XinShuCallable(api.getSupplyAPI(), new HashMap<>(), api.getParameters(),
                        "");
                cacheData = xinShuCallable.call();
                logger.info(super.api.getCode() + " response:" + cacheData);
                if (cacheData != null && "0000".equals(cacheData.getString("rc"))) {
                    putCache(api, cacheData);
                }
            }
            if (cacheData == null) {
                return false;
            } else {
                super.apiResponse = cacheData;
                return true;
            }
        }
    
        @Override
        public BaseModule analyseData() {
            //       ,  
        }
    
        @Override
        public void setModuleIntoReport(BaseModule module, Integer displayOrder) {
            module.setDisplaySort(displayOrder);
            report.setFraudModule((FraudModule) module);
        }
    }
    

    변경 후 가장 주요한 변화는 주 정책과 예비 정책이 Module Manager 클래스의 반사 필드를 수정함으로써 플러그인을 실현할 수 있다는 것이다.또한 같은 모듈 다중전략이 있다면 체인 테이블의 형식을 참고하여 전략의 무한한 증가를 실현할 수 있다.그러나 실제 상황을 감안하면 이번에는 두 가지 전략으로 끝났다.

    좋은 웹페이지 즐겨찾기