Skip to content

Latest commit

 

History

History
72 lines (48 loc) · 6.91 KB

File metadata and controls

72 lines (48 loc) · 6.91 KB

Шаблонный метод

UML

Определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы. Паттерн позволяет подклассам переопределять шаги алгоритма, не меняя его общей структуры.

Перехватчик (hook) - метод объявленный в абстрактном классе, но имеющий пустую реализацию (или по умолчанию). Дает возможность, по желанию, субкалссу подключаться к алгоритму в разных точках. (Для необязательных частей алгоритма)

Применение JAVA : java.util.Arrays.sort() - Не похожа на обычную реализацию (через наследование), так как sort() статический. Нужно для сравниваемых объектов реализовать интерфейс Comparable метод compereTo(), который используется в методе sort().

Применимость

  • Когда подклассы должны расширять базовый алгоритм, не меняя его структуры.

    • Шаблонный метод позволяет подклассам расширять определённые шаги алгоритма через наследование, не меняя при этом структуру алгоритмов, объявленную в родительском классе.
  • Когда у вас есть несколько классов, делающих одно и то же с незначительными отличиями. Если вы редактируете один класс, то приходится вносить такие же правки и в остальные классы.

    • Паттерн шаблонный метод предлагает создать для похожих классов общий суперкласс и оформить в нём главный алгоритма в виде шагов. Отличающиеся шаги можно переопределить в подклассах.

      Это позволит убрать дублирование кода в нескольких классах с похожим поведением, но отличающихся в деталях.

Шаги реализации

  1. Изучите алгоритм и подумайте, можно ли его разбить на шаги. Какие шаги будут стандартными для всех вариаций алгоритма, а какие - изменчивыми.

  2. Создайте абстрактный базовый класс. Определите в нём шаблонный метод. Этот метод должен состоять из вызовов шагов алгоритма. Имеет смысл сделать шаблонный метод финальным, чтобы подклассы не могли его переопределить.

  3. Добавьте в абстрактный класс методы для каждого из шагов алгоритма. Стандартные шаги должны иметь реализацию по умолчанию. Изменяемые шаги должны быть объявлены абстрактными. Их нужно будет реализовать в подклассах.

  4. Подумайте о введении в алгоритм хуков. Чаще всего, хуки располагают между основными шагами алгоритма, а также до и после всех шагов.

  5. Создайте конкретные классы, унаследовав их от абстрактного класса. Реализуйте в них все недостающие шаги и хуки.

Преимущества и недостатки

+ -
Облегчает повторное использование кода. Вы можете нарушить Принцип подстановки Барбары Лисков, изменяя базовое поведение одного из шагов алгоритма через подкласс.
Вы жёстко ограничены скелетом существующего алгоритма. С ростом количества шагов, шаблонный метод становится слишком сложно поддерживать.

Отношения с другими паттернами

  • Фабричный метод можно рассматривать как частный случай Шаблонного метода. Кроме того, Фабричный метод нередко бывает частью большого класса с Шаблонными методами.

  • Шаблонный метод использует наследование, чтобы расширять части алгоритма. Стратегия использует делегирование, чтобы изменять алгоритм. Шаблонный метод работает на уровне классов. Стратегия позволяет менять логику отдельных объектов.