扩展策略模式的功能
Extending functionality of Strategy pattern
我正在开发一个比较文件的应用程序。我决定使用策略设计模式来处理不同的格式,所以我有这样的东西:
public class Report {
CompareStrategy strategy;
...
}
public interface CompareStrategy {
int compare(InputStream A, InputStreamB);
}
然后,我自然而然地实现了针对不同文件格式的比较方法。
现在假设我想添加另一种方法,它处理比较的某些限制(例如,在 Excel 或 csv 文件的情况下省略一行,或者在 XML 中省略一个节点).
是否更好:
- 在接口和每个实现中添加另一个方法(目前很少)
- 写一个新的接口继承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 可以实现基接口或子接口,如果它需要两种方法.
- 关于你的第二个问题 - 在我看来有点像过度设计,但同样取决于你的需要。
我正在开发一个比较文件的应用程序。我决定使用策略设计模式来处理不同的格式,所以我有这样的东西:
public class Report {
CompareStrategy strategy;
...
}
public interface CompareStrategy {
int compare(InputStream A, InputStreamB);
}
然后,我自然而然地实现了针对不同文件格式的比较方法。
现在假设我想添加另一种方法,它处理比较的某些限制(例如,在 Excel 或 csv 文件的情况下省略一行,或者在 XML 中省略一个节点).
是否更好:
- 在接口和每个实现中添加另一个方法(目前很少)
- 写一个新的接口继承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 可以实现基接口或子接口,如果它需要两种方法.
- 关于你的第二个问题 - 在我看来有点像过度设计,但同样取决于你的需要。