1

我有一个简单(可能很常见)的设计问题。假设我有一个如下所示的界面:

public interface AnalysisResult {

    BigDecimal getMeasure();

}

然而,这后来由几个不同的具体实现实现 - 一些还包括平均字段,一些包含各种属性的计数等。现在,我得到了一组,AnalysisResult我希望能够根据类型,即平均结果会说平均值是什么在 Measure 等之上。一种方法是在接口上公开一个方法 say outputResult(),但问题是我可能想以 HTML 格式输出结果, CSV 和许多其他的,所以我需要一个方法。此外,可能存在我想根据类型输出一些内容的情况,例如:“这是平均结果”......你会说在这种情况下,简单地使用instanceof和完成工作会更容易吗?输出端?

4

4 回答 4

1

我会去进一步扩展..像

public interface Measure {
   public String getOutputAsTxt();
   public String getOutputAsCsv();
   public String getOutputAsFunnyFormat();
};

public interface AnalysisResult {

  public Measure getMeasure();

}

从而将输出专业化移动到特定的度量。是的,这增加了一些代码,但保持一切整洁和分开。

或者我会尝试探索一下访问者模式(这是一种简单的实现)。

有关更多信息,请参阅此 SO 问题中选择的答案(每次我读到它时,我都会因为它的真棒而感到 +1 的冲动)

于 2012-12-18T08:50:19.813 回答
0

根据类型的结果:

这是一个单独的行为,因此建议您实现类似Strategy Pattern的东西。有一个具有方法 print() 的基本接口。然后您可以在多个实现类(如 CSVStylePrint、HTMLStylePrint 等)中实现此方法。

这样,您的打印功能是独立的,并且您遵循OCP(开放封闭原则:即开放以扩展但封闭以更改)原则。OCP 是策略模式中使用的底层设计原则。

于 2012-12-18T08:53:23.220 回答
0

我建议在接口中使用方法 public String getOutput(String format) 。

让实现根据“格式”参数决定返回什么。

这也将有助于调用特定于特定实现的方法。

于 2012-12-18T08:55:04.817 回答
0

以常见的 xml 格式保存结果数据,并使用 XSLT 将原始数据转换为所需的格式。JUnit 使用测试结果执行此操作。当您稍后决定添加不同的格式时,无需更改代码。

于 2012-12-18T08:59:59.903 回答