정책 모드 기반 플러그 가능 디자인2
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 클래스의 반사 필드를 수정함으로써 플러그인을 실현할 수 있다는 것이다.또한 같은 모듈 다중전략이 있다면 체인 테이블의 형식을 참고하여 전략의 무한한 증가를 실현할 수 있다.그러나 실제 상황을 감안하면 이번에는 두 가지 전략으로 끝났다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.