Я реализую класс службы, имеющий такой метод:
public void makeSomething() {
// some logic...
// [optional logic]
// some other logic...
}
Это конкретный класс, и его можно создать и использовать "как есть", но мне нужно его расширить и переопределить метод makeSomething()
добавив некоторую дополнительную логику (посередине). Я имею в виду: мне нужно использовать ту же логику в родительском методе, но мне нужно расширить логику до возврата.
Моя первая идея заключалась в том, чтобы добавить "дополнительный" метод в середине исходного метода:
public void makeSomething() {
// some logic...
optionalOperation();
// some other logic...
}
и в конечном итоге переопределить метод optionalOperation()
в расширении классов. Но мне это не нравится: у меня будет пустой метод, который ничего не делает в моем первоначальном классе...
Итак, есть ли лучший способ разработать мой метод? Есть ли какой-то шаблон дизайна, посвященный моей проблеме?
Боюсь, шаблон дизайна называется Template method, и он работает точно так, как вам не нравится.
Например, код Spring полон таких пустых protected
методов, ожидающих, что вы добавите в них что-то обычное.
Простым решением будет следующее:
public class AClass {
public void makeSomething() {
someLogic();
someOtherLogic();
}
protected void someLogic() {
System.out.println("some logic");
}
protected void someOtherLogic() {
System.out.println("some other logic");
}
}
public class AnEnhancedClass extends AClass {
@Override
public void makeSomething() {
someLogic();
System.out.println("optional operation");
someOtherLogic();
}
}
я могу думать о 2 способах: