Template Method — это поведенческий паттерн, который определяет скелет алгоритма в суперклассе, а подклассы переопределяют конкретные шаги, не меняя общую структуру.
Простыми словами: рецепт борща одинаков (порезать → сварить → подать), но ингредиенты у каждого свои.
▪️ Пример:
Генератор отчётов: шаги одинаковые (загрузить данные → обработать → отформатировать → отправить), но формат вывода — PDF, Excel, HTML — разный.
// Абстрактный класс с шаблонным методом
abstract class ReportGenerator {
// Template Method — final, чтобы подклассы не меняли порядок
public final void generateReport() {
List<Map<String, Object>> data = fetchData();
List<Map<String, Object>> processed = processData(data);
String output = format(processed);
send(output);
}
// Общий шаг
private List<Map<String, Object>> fetchData() {
System.out.println("Загрузка из БД...");
return List.of(Map.of("revenue", 1_000_000));
}
// Общий шаг с возможностью расширения
protected List<Map<String, Object>> processData(
List<Map<String, Object>> data) {
return data; // по умолчанию — без обработки
}
// Абстрактный шаг — подклассы обязаны реализовать
protected abstract String format(List<Map<String, Object>> data);
// Hook — подклассы могут переопределить
protected void send(String output) {
System.out.println("Отправка по email: " + output.substring(0, 50));
}
}
class PdfReportGenerator extends ReportGenerator {
protected String format(List<Map<String, Object>> data) {
return "PDF: " + data.toString();
}
}
class ExcelReportGenerator extends ReportGenerator {
protected String format(List<Map<String, Object>> data) {
return "XLSX: " + data.toString();
}
@Override
protected void send(String output) {
System.out.println("Загрузка в Google Drive: " + output.substring(0, 50));
}
}
// Использование
new PdfReportGenerator().generateReport();
new ExcelReportGenerator().generateReport();
▪️ Когда использовать
— Алгоритм одинаков по структуре, но шаги различаются
— Хотите избежать дублирования кода между похожими классами
— В Spring: JdbcTemplate, RestTemplate — классические примеры
▪️ Template Method vs Strategy
— Template Method: наследование, подклассы переопределяют шаги
— Strategy: композиция, алгоритм передаётся извне
▪️ Минус
Жёсткая привязка к наследованию; нарушается LSP, если подклассы ломают контракт шагов.
🐸 Библиотека собеса по Java
#patterns