Получить доступ

В чём принципиальная разница между Template Method и Strategy?

MiddleПаттерны проектирования
Коротко

Template Method — наследование на этапе компиляции: скелет алгоритма в базовом классе, подкласс заполняет шаги. Strategy — композиция во время выполнения: алгоритм передаётся объектом, его можно подменить и протестировать отдельно.

  • Template Method даёт доступ к protected-состоянию, но жёстко связывает
  • Strategy предпочтительнее по принципу «композиция вместо наследования»
  • JDK: AbstractList (Template Method), Comparator (Strategy)

А ещё Spring: JdbcTemplate совмещает — шаблон плюс колбэки-стратегии

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Template Method фиксирует скелет алгоритма в базовом классе, а подкласс заполняет шаги: связь жёсткая, один вариант — один подкласс, зато есть доступ к protected-состоянию базового класса. Strategy передаёт алгоритм объектом: его можно подменить в рантайме, переиспользовать и протестировать отдельно. По принципу «композиция важнее наследования» при прочих равных выбирают Strategy. Примеры: HttpServlet.service() и AbstractList — Template Method; Comparator — Strategy.

Что хотят услышать

  • Наследование против композиции.
  • Плюсы и минусы, примеры.

Частые ошибки

  • Называть JdbcTemplate чистым Template Method: там шаг приходит композицией через RowMapper, то есть это template + callback.
  • Считать, что Template Method не даёт гибкости вовсе — она есть, но фиксируется на этапе компиляции.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Template Method параметризует поведение наследованием на этапе компиляции, Strategy — композицией в рантайме
  • ✗Template Method применим только к абстрактным классам, Strategy — только к интерфейсам
  • ✗Template Method работает с одним алгоритмом, Strategy — обязательно с несколькими
  • ✗Разницы нет, это два названия одного паттерна

Что спросят дальше

  • Почему метод-шаблон обычно делают final?
  • Почему JdbcTemplate ближе к callback, чем к классическому Template Method?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем