0Pricing
Java Academy · Урок

Шаблон Template Method: каркасы алгоритмов

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

«Шаблон Template Method: каркасы алгоритмов» — бесплатный урок Java Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Назначение шаблонного метода

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

Абстрактный базовый класс

Базовый класс содержит шаблонный метод, обычно final, который координирует шаги. Абстрактные методы представляют изменяющиеся шаги. Конкретные методы задают поведение по умолчанию.

public abstract class DataProcessor {
    // Template method — final, defines the algorithm
    public final void process() {
        readData();
        processData();
        writeResult();
    }
    protected abstract void readData();
    protected abstract void processData();
    protected void writeResult() {
        System.out.println("Result written (default)");
    }
}

Конкретные подклассы

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

public class CSVProcessor extends DataProcessor {
    protected void readData()    { System.out.println("Reading CSV..."); }
    protected void processData() { System.out.println("Parsing CSV rows..."); }
}
public class XMLProcessor extends DataProcessor {
    protected void readData()    { System.out.println("Reading XML..."); }
    protected void processData() { System.out.println("Parsing XML nodes..."); }
    @Override
    protected void writeResult() { System.out.println("Writing XML result."); }
}

Методы-перехватчики

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

public abstract class Game {
    public final void play() {
        initialize();
        while (!isDone()) takeTurn();
        printWinner();
    }
    protected void initialize() {}  // hook — optional override
    protected abstract boolean isDone();
    protected abstract void takeTurn();
    protected abstract void printWinner();
}

Шаблонный метод и стратегия

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

Java InputStream как шаблонный метод

Метод read(byte[], int, int) в java.io.InputStream реализован через абстрактный метод read(). Подклассы реализуют версию для одного байта, а чтение нескольких байтов представляет собой шаблон.

Шаблонный метод для создания отчётов

Определите шаблон отчёта: соберите данные, отформатируйте их и выведите результат. Заменяйте подклассы для вывода в PDF, HTML или CSV, не изменяя логику координации.

public abstract class ReportGenerator {
    public final String generate() {
        List<Record> data = fetchData();
        String body = format(data);
        return wrap(body);
    }
    protected abstract List<Record> fetchData();
    protected abstract String format(List<Record> data);
    protected String wrap(String body) { return body; } // hook
}

Запрет переопределения шаблона

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

public final void process() {
    validate(); // abstract
    execute();  // abstract
    cleanup();  // hook with default
}

Абстрактные и конкретные шаги

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

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

setUp() и tearDown() в JUnit 4 — это перехватчики шаблонного метода, определённого средством запуска тестов. Средство запуска управляет моментом их вызова.

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

JdbcTemplate в Spring использует шаблонный метод внутри. Шаблон управляет соединением, созданием оператора и очисткой, а вы предоставляете лямбда-выражение RowMapper для изменяющегося шага «отобразить строку».

List<User> users = jdbcTemplate.query(
    "SELECT * FROM users",
    (rs, row) -> new User(rs.getLong("id"), rs.getString("name"))
);

Избегайте глубокой иерархии наследования

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

Быстрая проверка

Какое ключевое слово не позволяет подклассам изменять последовательность шаблонного метода?

Повторение

Шаблонный метод фиксирует каркас алгоритма в базовом классе с помощью final. Подклассы реализуют абстрактные шаги и при необходимости переопределяют перехватчики. Делайте иерархии неглубокими, а при необходимости большей гибкости используйте Стратегию.

Часто задаваемые вопросы

Урок «Шаблон Template Method: каркасы алгоритмов» бесплатный?

Да — полный текст урока «Шаблон Template Method: каркасы алгоритмов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Шаблон Template Method: каркасы алгоритмов»?

Определяйте каркас алгоритма в базовом классе и позволяйте подклассам заполнять отдельные шаги. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Шаблон Template Method: каркасы алгоритмов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Шаблон Observer: уведомление о событиях
  2. Шаблон Strategy: взаимозаменяемые алгоритмы
  3. Шаблон Command: инкапсуляция действий
  4. Шаблон Template Method: каркасы алгоритмов
← Назад к Java Academy