Что такое шаблонный метод (Template Method) в паттернах проектирования?

«Что такое шаблонный метод (Template Method) в паттернах проектирования?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Шаблонный метод (Template Method) — это поведенческий паттерн проектирования, который определяет скелет алгоритма в базовом классе, позволяя подклассам переопределять отдельные шаги алгоритма, не меняя его общей структуры.

Ключевая идея: Базовый класс объявляет шаблонный метод, который состоит из вызовов абстрактных или конкретных (часто с реализацией по умолчанию) примитивных методов. Подклассы реализуют эти примитивные методы, чтобы адаптировать алгоритм под свои нужды.

Пример на Java:

// Абстрактный класс, определяющий шаблонный метод
abstract class DataProcessor {
    // Шаблонный метод (часто final, чтобы запретить изменение структуры)
    public final void process() {
        loadData();
        transformData();
        saveData();
        logResult();
    }

    // Шаги алгоритма, которые могут быть переопределены
    abstract void loadData();
    abstract void transformData();

    void saveData() {
        // Реализация по умолчанию
        System.out.println("Сохранение данных в БД...");
    }

    void logResult() {
        // Реализация по умолчанию (Hook)
        System.out.println("Обработка завершена.");
    }
}

// Конкретная реализация
class CsvDataProcessor extends DataProcessor {
    @Override
    void loadData() {
        System.out.println("Загрузка данных из CSV-файла.");
    }

    @Override
    void transformData() {
        System.out.println("Преобразование CSV-данных.");
    }
}

Использование:

DataProcessor processor = new CsvDataProcessor();
processor.process(); // Выполняется алгоритм с пользовательскими шагами.

Преимущества:

  • Избегает дублирования кода: Общая структура алгоритма определена в одном месте.
  • Контроль над алгоритмом: Базовый класс контролирует структуру и точки расширения.
  • Упрощает поддержку: Изменения в алгоритме вносятся в основном в базовый класс.

Недостатки:

  • Может ограничивать гибкость: Подклассы обязаны следовать заданной структуре.
  • Ведет к наследованию: Чрезмерное использование может усложнить иерархию классов.

Применение: Фреймворки (например, для инициализации приложений), обработка данных, алгоритмы с вариативными шагами.