扩展策略模式的功能

Extending functionality of Strategy pattern

我正在开发一个比较文件的应用程序。我决定使用策略设计模式来处理不同的格式,所以我有这样的东西:

public class Report {
   CompareStrategy strategy;
   ...
}


public interface CompareStrategy {
   int compare(InputStream A, InputStreamB);
}

然后,我自然而然地实现了针对不同文件格式的比较方法。

现在假设我想添加另一种方法,它处理比较的某些限制(例如,在 Excel 或 csv 文件的情况下省略一行,或者在 XML 中省略一个节点).

是否更好:

  1. 在接口和每个实现中添加另一个方法(目前很少)
  2. 写一个新的接口继承CompareStrategy然后实现?

第二个问题是:由于差异可以是多种类型的 - 是否可以制作一个标记界面差异来启用类似的东西:

int compareWithDifferences(..., Iterable<Difference> differences);

然后继续定义特定文件格式的差异意味着什么?

我认为您或许应该编写另一个继承自 CompareStrategy 的接口。像这样,如果你需要 compareWithDifferences() 你可以,但你不必使用这个界面你仍然可以使用更简单的界面,没有任何区别。

正如乔纳森所说,如果你能预见到困难,就做好准备。在那种情况下,我认为你应该做好准备。事实上,创建另一个界面不会花费您很多时间,而且您以后也不必重构。

Now suppose I wanted to add another method, that deals with certain restrictions for the comparison (e.g. omit a row in case of an Excel or csv file, or omit a node in XML).

看来您需要 Template Pattern

您可以创建一些摘要class,例如

public abstract class XMLCompareStrategy implements CompareStrategy {

    public int compare(InputStream A, InputStreamB) {
        // several steps
        customMethod(...);
        // more steps
    }

    protected abstract ... customMethod(...);

}

通过这种方式,您可以创建多个具有主要或核心功能的 classes,并为每种情况提供自定义详细信息

答案真的取决于您的需要:

  • 如果该方法总是 被实施 - 将其添加到现有界面。如果它只是 optional - 创建一个将扩展当前接口的新接口,然后实现的 class 可以实现基接口或子接口,如果它需要两种方法.
  • 关于你的第二个问题 - 在我看来有点像过度设计,但同样取决于你的需要。