Я разрабатываю приложение, которое сравнивает файлы. Я решил использовать шаблон проектирования «Стратегия» для работы с разными форматами, поэтому у меня получилось что-то вроде этого:
public class Report {
CompareStrategy strategy;
...
}
public interface CompareStrategy {
int compare(InputStream A, InputStreamB);
}
Затем, естественно, я реализую метод сравнения для разных форматов файлов.
Теперь предположим, что я хочу добавить еще один метод, который имеет дело с определенными ограничениями для сравнения (например, опустить строку в случае файла Excel или csv или опустить узел в XML).
Было бы лучше:
- Добавить еще один метод в интерфейс и каждую реализацию (на данный момент их немного)
- Написать новый интерфейс, наследуемый от CompareStrategy, а затем реализовать его?
Второй вопрос: так как различия могут быть разных типов - можно ли сделать маркер interface Difference, чтобы включить что-то вроде:
int compareWithDifferences(..., Iterable<Difference> differences);
а затем продолжить определение того, что означает разница для конкретного формата файла?
bool canCompare(a, b)
- person plalx   schedule 01.08.2017CompareStrategy
, не заботясь о том, какая реализация является при условии. Если вам нужна расширяемость, то вам, скорее всего, нужен такой интерфейс, чтобы вы могли динамически регистрировать новые компараторы, но это не шаблон стратегии, и из интерфейса должно быть ясно, что вызов компаратора с неправильным содержимым может вызвать выброс. - person plalx   schedule 01.08.2017XMLCompareStrategy
с содержимым HTML. Поэтомуstrategy1.compare(a, b)
может работать, аstrategy2.compare(a, b)
может не работать для тех жеa
иb
. Этого не должно быть в случае с шаблоном стратегии. - person plalx   schedule 01.08.2017report.getStrategy.compare(a, b)
, не слишком беспокоясь о формате. Какой еще узор посоветуете? - person DCzo   schedule 01.08.2017Comparator
и добавил в интерфейс объявление throws, чтобы явно указать, что он может потерпеть неудачу. - person plalx   schedule 01.08.2017