我们应该设计接口以包含对象操纵器

时间:2016-03-31 13:00:28

标签: java design-patterns interface

我有一个名为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吗?但随后它将破坏不向接口添加对象操纵器的设计惯例。
  • 我的设计在哪里变坏了?或者我错过了什么?

2 个答案:

答案 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时,您可以像其他任何报告一样使用其结果,而不会违反您的标准设计惯例。

相关问题