针对相同的业务流程中,个别不同的处理方式,可以通过工厂模式+抽象类+重写实现类的方式来降低代码量。
基于枚举获取工厂处理服务
@Component
public class ModelDataServiceFactory {
private Map<ModelTypeEnum, ModelDataService> modelTypeMapDataService = new HashMap<>();
@Autowired
private List<AbstractModelDataServiceImpl> services;
public ModelDataService modelType(ModelTypeEnum modelType) {
if (Objects.isNull(modelType)) {
throw new BusinessException("ModelDataServiceFactory modelType is null");
}
return modelTypeMapDataService.get(modelType);
}
@PostConstruct
public void init() {
services.forEach(service -> modelTypeMapDataService.put(service.getModelType(), service));
}
}
接口和抽象类
public interface ModelDataService {
/**
* 导入数据集数据
*
* @param experimentName 实验名称
* @param dataSetType 数据集类型
* @param modelTypeCode 模型类型code
* @param dataUrls 数据url列表
* @param experimentId 实验id
* @return {@link DataSetCreateBO}
*/
DataSetCreateBO importData(Long experimentId,String experimentName, String dataSetType, String modelTypeCode, List<String> dataUrls);
/**
* 导出实验运行结束后的模型数据
*
* @param experimentId 实验id
* @param experimentTaskId 实验任务id, 可选值,如果为空则取最近一次成功的任务id
* @param targetStepNum 目标步骤编号
* @return {@link List}<{@link String}>
*/
List<String> exportData(Long experimentId,Long experimentTaskId,Integer targetStepNum);
/**
* 检查模型输出数据
*
* @param experimentTaskId 实验任务id
* @return {@link String} 模型生成的文件地址,字符串为json格式
*/
ModelOutputDataCheckResultBO checkOutputData(Long experimentTaskId);
}
抽象类
@Slf4j
public abstract class AbstractModelDataServiceImpl implements ModelDataService {
public abstract ModelTypeEnum getModelType();
@Override
public ModelOutputDataCheckResultBO checkOutputData(Long experimentTaskId) {
ModelOutputDataCheckResultBO checkResultBO = new ModelOutputDataCheckResultBO();
checkResultBO.setIsOk(true);
return checkResultBO;
}
@Override
public DataSetCreateBO importData(Long experimentId,String experimentName,String dataSetType,String modelTypeCode, List<String> dataUrls) {
DataSetCreateBO dataSetCreateBO = this.createDataSet(dataSetType,experimentName);
if (Objects.isNull(dataSetCreateBO)) {
throw new BusinessException(CommonStatus.SYSTEM_ERROR_MSG,"data set is null");
}
this.importDataSetContent(dataSetCreateBO,modelTypeCode,dataUrls);
return dataSetCreateBO;
}
@Override
public List<String> exportData(Long experimentId, Long experimentTaskId,Integer targetStepNum) {
Map<String,String> outputDatas = this.exportMapData(experimentId,experimentTaskId,targetStepNum);
return parseModelOutputData(outputDatas,targetStepNum);
}
}
实现类
@Slf4j
@Service
public class ModelDataOfClassifyServiceImpl extends AbstractModelDataServiceImpl {
@Override
public ModelTypeEnum getModelType() {
return ModelTypeEnum.CLASSIFY;
}
/**
*
* @param experimentId 实验id
* @param experimentName 实验名称
* @param dataSetType 数据集类型
* @param modelTypeCode 模型类型code
* @param dataUrls 数据url列表
* @return
*/
@Override
public DataSetCreateBO importData(Long experimentId, String experimentName, String dataSetType, String modelTypeCode, List<String> dataUrls) {
xxx
return null;
}
}
调用类
@Autowired
private ModelDataServiceFactory modelDataServiceFactory;
ModelOutputDataCheckResultBO checkResultBO = modelDataServiceFactory.modelType(ModelTypeEnum.getEnumByDefName(experiment.getModelTypeCode())).checkOutputData(experimentTask.getId());