Определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы. Паттерн позволяет подклассам переопределять шаги алгоритма, не меняя его общей структуры.
Перехватчик (hook) - метод объявленный в абстрактном классе, но имеющий пустую реализацию (или по умолчанию). Дает возможность, по желанию, субкалссу подключаться к алгоритму в разных точках. (Для необязательных частей алгоритма)
Применение JAVA : java.util.Arrays.sort() - Не похожа на обычную реализацию (через наследование), так как sort() статический. Нужно для сравниваемых объектов реализовать интерфейс Comparable метод compereTo(), который используется в методе sort().
-
Когда подклассы должны расширять базовый алгоритм, не меняя его структуры.
- Шаблонный метод позволяет подклассам расширять определённые шаги алгоритма через наследование, не меняя при этом структуру алгоритмов, объявленную в родительском классе.
-
Когда у вас есть несколько классов, делающих одно и то же с незначительными отличиями. Если вы редактируете один класс, то приходится вносить такие же правки и в остальные классы.
-
Паттерн шаблонный метод предлагает создать для похожих классов общий суперкласс и оформить в нём главный алгоритма в виде шагов. Отличающиеся шаги можно переопределить в подклассах.
Это позволит убрать дублирование кода в нескольких классах с похожим поведением, но отличающихся в деталях.
-
-
Изучите алгоритм и подумайте, можно ли его разбить на шаги. Какие шаги будут стандартными для всех вариаций алгоритма, а какие - изменчивыми.
-
Создайте абстрактный базовый класс. Определите в нём шаблонный метод. Этот метод должен состоять из вызовов шагов алгоритма. Имеет смысл сделать шаблонный метод финальным, чтобы подклассы не могли его переопределить.
-
Добавьте в абстрактный класс методы для каждого из шагов алгоритма. Стандартные шаги должны иметь реализацию по умолчанию. Изменяемые шаги должны быть объявлены абстрактными. Их нужно будет реализовать в подклассах.
-
Подумайте о введении в алгоритм хуков. Чаще всего, хуки располагают между основными шагами алгоритма, а также до и после всех шагов.
-
Создайте конкретные классы, унаследовав их от абстрактного класса. Реализуйте в них все недостающие шаги и хуки.
| + | - |
|---|---|
| Облегчает повторное использование кода. | Вы можете нарушить Принцип подстановки Барбары Лисков, изменяя базовое поведение одного из шагов алгоритма через подкласс. |
| Вы жёстко ограничены скелетом существующего алгоритма. | С ростом количества шагов, шаблонный метод становится слишком сложно поддерживать. |
-
Фабричный метод можно рассматривать как частный случай Шаблонного метода. Кроме того, Фабричный метод нередко бывает частью большого класса с Шаблонными методами.
-
Шаблонный метод использует наследование, чтобы расширять части алгоритма. Стратегия использует делегирование, чтобы изменять алгоритм. Шаблонный метод работает на уровне классов. Стратегия позволяет менять логику отдельных объектов.
