Частичное переопределение метода: как?

1

Я реализую класс службы, имеющий такой метод:

public void makeSomething() {

    // some logic...

    // [optional logic]

    // some other logic...
}

Это конкретный класс, и его можно создать и использовать "как есть", но мне нужно его расширить и переопределить метод makeSomething() добавив некоторую дополнительную логику (посередине). Я имею в виду: мне нужно использовать ту же логику в родительском методе, но мне нужно расширить логику до возврата.

Моя первая идея заключалась в том, чтобы добавить "дополнительный" метод в середине исходного метода:

public void makeSomething() {

    // some logic...

    optionalOperation();

    // some other logic...
}

и в конечном итоге переопределить метод optionalOperation() в расширении классов. Но мне это не нравится: у меня будет пустой метод, который ничего не делает в моем первоначальном классе...

Итак, есть ли лучший способ разработать мой метод? Есть ли какой-то шаблон дизайна, посвященный моей проблеме?

Теги:
design-patterns
design
override
extends

3 ответа

3
Лучший ответ

Боюсь, шаблон дизайна называется Template method, и он работает точно так, как вам не нравится.

Например, код Spring полон таких пустых protected методов, ожидающих, что вы добавите в них что-то обычное.

  • 0
    это ясно, я знаю шаблон шаблона, но я думал, что было бы правильно использовать его только тогда, когда ДОЛЖНА быть реализована часть метода (абстрактный метод). В этом случае необязательная часть метода МОЖЕТ быть реализована, не является обязательной ...
  • 0
    Это небольшая вариация на ту же тему. Я не думаю, что вам нужно другое имя для этого.
Показать ещё 3 комментария
0

Простым решением будет следующее:

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();
    }

}
0

я могу думать о 2 способах:

  • наследование и общий "жизненный цикл", а также метод шаблонов. это очень проблематично поддерживать, когда оно находится в середине вашей бизнес-логики
  • стратегия. попробуйте реорганизовать и передать стратегию методу или объекту, владеющему этим методом. если вы можете использовать любой функциональный язык, вы можете принять его до крайности и вместо того, чтобы передавать стратегию, используйте композицию функции: define 'makeSomething' как функцию других функций. и один из "makeSomething" будет содержать также "optionalOperation" в нем определение. но для этого может потребоваться действительно тяжелый рефакторинг

Ещё вопросы

Сообщество Overcoder
Наверх
Меню