TGViewer
Библиотека собеса по Java | вопросы с собеседований Библиотека собеса по Java | вопросы с собеседований @java_interview_lib · 6.44K subscribers
Post #1342 986
Расскажите о паттерне Template Method

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
  • 👍 7
  • 🔥 2
  • 👏 2
More from @java_interview_lib
  1. Sep 15, 2026❓ Расскажите о паттерне Facade Facade — это структурный паттерн, который предоставляет про…
  2. Sep 15, 2026😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как трати…
  3. Aug 5, 2026❓ Что такое "diamond problem" и как его решает Java? «Diamond problem» возникает при множе…
  4. Aug 5, 2026👅 Самое сложное — выбрать не курс, а направление Сегодня хочется разобраться в AI-агентах…
  5. Aug 5, 2026Один доступ вместо вечного выбора между «нужно для работы» и «давно хотелось изучить» 👇
  6. Jul 31, 2026❓ Как работает ConcurrentHashMap? ConcurrentHashMap использует сегментирование / распростр…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →