Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Яка ідея патерну Template Method?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Патерн **Template Method (Шаблонний метод)** задає **скелет (структуру) алгоритму** в базовому класі, дозволяючи **підкласам перевизначати окремі кроки** без зміни загальної послідовності дій. **Ключове:** базовий клас вирішує, *"що і в якому порядку робити"*, а підкласи - *"як саме це робити"*.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняПатерн **Template Method (Шаблонний метод)** задає **скелет (структуру) алгоритму** в базовому класі, дозволяючи **підкласам перевизначати окремі кроки** без зміни загальної послідовності дій. --- ### 1. **Головна ідея** > Визначити "шаблон" виконання алгоритму в одному місці (у суперкласі), > але дати підкласам можливість **змінювати конкретні кроки**, зберігаючи загальний порядок. Іншими словами: - базовий клас керує **порядком виконання**, - дочірні класи керують **деталями реалізації**. --- ### 2. **Приклад (Java)** #### **Абстрактний клас із шаблонним методом** ```java abstract class DataProcessor { // Шаблонний метод public final void processData() { readData(); processDataInternal(); saveData(); } protected abstract void readData(); protected abstract void processDataInternal(); protected void saveData() { System.out.println("Збереження даних у БД..."); } } ``` #### **Конкретні реалізації** ```java class CSVProcessor extends DataProcessor { protected void readData() { System.out.println("Читання CSV-файлу"); } protected void processDataInternal() { System.out.println("Парсинг рядків CSV"); } } class JSONProcessor extends DataProcessor { protected void readData() { System.out.println("Читання JSON-файлу"); } protected void processDataInternal() { System.out.println("Парсинг JSON-структури"); } } ``` #### **Використання** ```java DataProcessor processor = new CSVProcessor(); processor.processData(); ``` **Результат:** ```javascript Читання CSV-файлу Парсинг рядків CSV Збереження даних у БД... ``` --- ### 3. **Що відбувається** - Метод `processData()` - **фіксує структуру алгоритму**. - Підкласи перевизначають лише "порожні місця" (`readData()`, `processDataInternal()`), не змінюючи сам "скелет" процесу. - `processData()` оголошено як `final`, щоб заборонити змінювати послідовність кроків. --- ### 4. **Де це застосовується** - Коли потрібно **гарантувати однакову послідовність дій**, але при цьому **різні реалізації деталей**. > Наприклад: генерація звітів, обробка файлів, рендеринг сторінок. - Коли частина алгоритму **спільна**, а інша **змінюється від підкласу до підкласу**. - Коли потрібно **контролювати "життєвий цикл"** операції, але дозволити дочірнім класам вставити свою логіку. --- ### 5. **Переваги** - Прибирає дублювання спільної логіки. - Робить процес розширюваним без переписування базового алгоритму. - Гарантує правильний порядок виконання кроків. --- ### 6. **Недоліки** - Сильна залежність між суперкласом і підкласами. - Складно підтримувати, якщо алгоритм надто складний або часто змінюється. --- ### **Висновок** Патерн **Template Method** задає "каркас" алгоритму, а конкретні деталі делегує підкласам. **Підсумок:** > Базовий клас вирішує *"що і в якому порядку робити"*, > а підкласи - *"як саме це робити"*.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.