Java OO设计-将结果的责任委托给不同的类

Java OO设计-将结果的责任委托给不同的类,java,oop,interface,abstract-class,Java,Oop,Interface,Abstract Class,我有一个类,它调用一个服务,该服务返回不同类型的预测。API返回每个预测类型的每个标签的置信度得分。目前我调用该服务,然后存储该服务返回的所有分数。然而,在做了一些调查之后,我发现在我的用例中,我需要为一种预测类型更改服务返回的标签的阈值 举个例子:我打电话给这个服务来预测一张图片是否是动物的,这个服务有两个标签是真还是假 { predictedValue: True, details: { True: 0.65, False: 0.35 } } predicted

我有一个类,它调用一个服务,该服务返回不同类型的预测。API返回每个预测类型的每个标签的置信度得分。目前我调用该服务,然后存储该服务返回的所有分数。然而,在做了一些调查之后,我发现在我的用例中,我需要为一种预测类型更改服务返回的标签的阈值

举个例子:我打电话给这个服务来预测一张图片是否是动物的,这个服务有两个标签是真还是假

{
  predictedValue: True,
  details: {
    True: 0.65,
    False: 0.35
  }
}
predictedValue字段是Predicted服务所有者认为图像基于其阈值的内容。但我的API结果表明,除非真实置信度大于0.70,否则它决不是动物

public class PredictionResults {
    String prediction;
    Map<String, Double> details;
}
public class PredictionServiceDataLoader {
    public void getAndStorePredictionResults(String predictionType, String id) {
        PredictionResults predictionResults = getPredictionByCallingPredictionService(predictionType);
        saveResults(predictionResults, id);
    }
}
公共类预测结果{
串预测;
地图详情;
}
公共类PredictionServiceDataLoader{
public void getAndStorePredictionResults(字符串predictionType,字符串id){
PredictionResults PredictionResults=getPredictionByCallingPredictionService(predictionType);
保存结果(predictionResults,id);
}
}
现在,由于我想覆盖服务返回的结果,一种方法是:

public void getAndStorePredictionResults(String predictionType, String id) {
    PredictionResults predictionResults = getPredictionByCallingPredictionService(predictionType);
    if(predictionType.equals("detectAnimal")) {
        //Override value based on threshold
        if(predictionResults.getDetails().get("True") < 0.70) {
            predictionResults.setPrediction("False");
        }
    }
    saveResults(predictionResults, id);
}
public void getAndStorePredictionResults(字符串predictionType,字符串id){
PredictionResults PredictionResults=getPredictionByCallingPredictionService(predictionType);
if(predictionType.equals(“detectAnimal”)){
//基于阈值的覆盖值
if(predictionResults.getDetails().get(“True”)<0.70){
预测结果。setPrediction(“假”);
}
}
保存结果(predictionResults,id);
}
现在,如果我想消除基于阈值外部预测服务CatalLoader更改结果的责任,那么我想通过以下方式实现:

public interface PredictionResultsOverride {
    public String getPreditionType();
    public String getPredictionResults(PredictionResults predictionResults);
}

public class AnimalPredictionResultOverride implements PredictionResultsOverride {
    @Override 
    public String getPreditionType() {
        return "detectAnimal";
    }

    @Override
    public String getPredictionResults(PredictionResults predictionResults) {
        if(predictionResults.getDetails().get("True") < 0.70) {
            predictionResults.setPrediction("False");
        }
    }
}
public class PredictionServiceDataLoader {

    @Autowired
    private List<PredictionResultsOverride> predictionResultsImpl;
    public void getAndStorePredictionResults(String predictionType, String id) {
        PredictionResults predictionResults = getPredictionByCallingPredictionService(predictionType);
        Optional<PredictionResultsOverride> predictionResultsOverrideImpl = 
            predictionResultsImpl.stream()
                .filter(x -> x.getType().equals(predictionType)) 
                .findFirst();
        predictionResults = predictionResultsOverrideImpl.map(x -> x.getPredictionResults(predictionResults)).orElse(predictionResults);
        saveResults(predictionResults, id);
    }
}
公共接口预测结果覆盖{
公共字符串getPredictionType();
公共字符串getPredictionResults(PredictionResults PredictionResults);
}
公共类AnimalPredictionResultOverride实现PredictionResultsOverride{
@凌驾
公共字符串getPredictionType(){
返回“detectAnimal”;
}
@凌驾
公共字符串getPredictionResults(PredictionResults PredictionResults){
if(predictionResults.getDetails().get(“True”)<0.70){
预测结果。setPrediction(“假”);
}
}
}
然后,我的PredictionServiceDataLoader将按照以下方式将修改结果的责任委托给其他类:

public interface PredictionResultsOverride {
    public String getPreditionType();
    public String getPredictionResults(PredictionResults predictionResults);
}

public class AnimalPredictionResultOverride implements PredictionResultsOverride {
    @Override 
    public String getPreditionType() {
        return "detectAnimal";
    }

    @Override
    public String getPredictionResults(PredictionResults predictionResults) {
        if(predictionResults.getDetails().get("True") < 0.70) {
            predictionResults.setPrediction("False");
        }
    }
}
public class PredictionServiceDataLoader {

    @Autowired
    private List<PredictionResultsOverride> predictionResultsImpl;
    public void getAndStorePredictionResults(String predictionType, String id) {
        PredictionResults predictionResults = getPredictionByCallingPredictionService(predictionType);
        Optional<PredictionResultsOverride> predictionResultsOverrideImpl = 
            predictionResultsImpl.stream()
                .filter(x -> x.getType().equals(predictionType)) 
                .findFirst();
        predictionResults = predictionResultsOverrideImpl.map(x -> x.getPredictionResults(predictionResults)).orElse(predictionResults);
        saveResults(predictionResults, id);
    }
}
公共类PredictionServiceDataLoader{
@自动连线
私有列表预测结果简单;
public void getAndStorePredictionResults(字符串predictionType,字符串id){
PredictionResults PredictionResults=getPredictionByCallingPredictionService(predictionType);
可选的predictionResultsOverrideImpl=
predictionResultsImpl.stream()
.filter(x->x.getType().equals(predictionType))
.findFirst();
predictionResults=predictionResultsOverrideImpl.map(x->x.getPredictionResults(predictionResults)).orElse(predictionResults);
保存结果(predictionResults,id);
}
}
这是将覆盖阈值的责任委托给其他类的最佳方式吗?我可以采取不同的方法吗?在我看来,PredictionServiceDataLoader类的职责应该只是调用预测服务并存储结果

“在我看来,PredictionServiceDataLoader类的职责应该只是调用预测服务并存储结果。”

您是正确的,理想情况下,PredictionServiceDataLoader应该检索并存储结果


您的要求是基于某些标准覆盖结果。在向最终用户展示之前(或在使用它进行进一步处理之前),可以注意这一点。通过这种方式,您将存储原始结果,并且可以在修改覆盖标准的情况下引用这些结果(例如,true应大于等于80%)。如果在覆盖结果后存储结果,则必须将其他详细信息(如IsOverrided、criteria等)与结果一起保留。

由于详细信息映射具有原始结果,我认为可以替换预测变量,因为服务认为标签就是这样的。因为它是一个映射,所以我还可以添加一个字段,表示它已被覆盖,