我有一个名为ValidationResult
的类,它实现了IValidationReport
。这些是通用实体,旨在封装我们拥有的各种验证器的输出。所有验证器都返回IValidationReport
。
作为标准设计实践,我们只在IValidationReport
中包含getter,并且没有可以操作返回对象内容的setter或方法。因此它有getResult(String filePath)
,getMessages(String filePath)
等,它返回验证结果,验证消息和其他验证指定文件的信息。
ValidationReport
具有addResult(filePath, message, ...)
形式的不同重载,它会根据指定的filePath
添加相应的信息。但是,我们在ValidationReport
中也有一种名为addResult(IValidationReport)
的方法。这种方法基本上可以合并两个ValidationReport
。因此,如果两个验证报告(调用此方法的方法以及作为参数传递的方法)具有相同文件的验证信息,那么它将被合并。
现在在我们的一个模块中,我们正在调用两个验证器。两者都有validate()
个方法,返回IValidationReport
。但是我无法将两者合并为IValidationReport
仅包含getter,但addResult(IValidationReport)
。以下是:
IValidationReport valrep1 = validator1.validate();
IValidationReport valrep2 = validator2.validate();
valrep1.addResult(valrep2); //cannot do this as valrep1 is IValidationReport and it does not contain addResult(IValidationReport)
addResult(IValidationReport)
添加到IValidationReport
吗?但随后它将破坏不向接口添加对象操纵器的设计惯例。答案 0 :(得分:1)
我认为更好的做法是拥有ValidationResult(IValidationReport ... reports)构造函数。
ValidationResult valResult = new ValidationResult(validator1.validate(), validator2.validate())
或类似的东西:)
答案 1 :(得分:1)
您可以创建一个简单的帮助程序来合并结果,然后返回一个新的接口实例。
public class ReportHelper {
public static IValidationReport merge(final String filePath, final IValidationReport r1, final IValidationReport r2){
return new IValidationReport(){
public String getResult(String filePath){
// Merge here r1.getResult(filePath) and r2.getResult(filePath)
//...
return "The merged content"; }
public String getMessages(String filePath){
// Merge here r1.getMessages(filePath) and r2.getMessages(filePath)
//...
return "The merged content";
}
};
}
当您的助手返回IValidationReport时,您可以像其他任何报告一样使用其结果,而不会违反您的标准设计惯例。