Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить патерн Strategy і навіщо він потрібен?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Патерн **Strategy (Стратегія)** призначений для **інкапсуляції різних алгоритмів поведінки** і **можливості підміняти їх під час виконання**, не змінюючи код самого об'єкта, який ці алгоритми використовує. **Ключове:** Strategy - це спосіб вибору алгоритму під час виконання без зміни коду, який цей алгоритм використовує.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняПатерн **Strategy (Стратегія)** призначений для **інкапсуляції різних алгоритмів поведінки** і **можливості підміняти їх під час виконання**, не змінюючи код самого об'єкта, який ці алгоритми використовує. --- ### 1. **Суть ідеї** Коли об'єкту потрібно виконувати якусь дію (наприклад, сортування, оплату, логування), але **спосіб виконання може змінюватися**, - ці способи виділяються в окремі класи. > Об'єкт делегує виконання алгоритму стратегії, > а не вирішує всередині себе, *який саме спосіб використовувати*. Таким чином, **алгоритми стають взаємозамінними** і незалежними. --- ### 2. **Учасники патерна** - **Context (Контекст)** - об'єкт, який використовує стратегію. Він зберігає посилання на поточну стратегію і викликає її методи. - **Strategy (Інтерфейс стратегії)** - спільний інтерфейс усіх алгоритмів. - **ConcreteStrategy (Конкретні стратегії)** - різні реалізації однієї й тієї самої поведінки. --- ### 3. **Приклад (Java)** Приклад: система оплати, де можна платити **карткою** або **PayPal**. ```java // Спільний інтерфейс стратегій interface PaymentStrategy { void pay(int amount); } // Конкретні стратегії class CreditCardPayment implements PaymentStrategy { public void pay(int amount) { System.out.println("Оплата " + amount + " через кредитну картку"); } } class PayPalPayment implements PaymentStrategy { public void pay(int amount) { System.out.println("Оплата " + amount + " через PayPal"); } } // Контекст class Order { private PaymentStrategy paymentStrategy; public Order(PaymentStrategy paymentStrategy) { this.paymentStrategy = paymentStrategy; } public void checkout(int amount) { paymentStrategy.pay(amount); } } ``` **Використання:** ```java Order order1 = new Order(new CreditCardPayment()); order1.checkout(100); // Оплата через картку Order order2 = new Order(new PayPalPayment()); order2.checkout(200); // Оплата через PayPal ``` --- ### 4. **Навіщо потрібен** 1. Щоб **розділити вибір алгоритму і його реалізацію**. Контекст не знає, *як саме* працює алгоритм - він просто викликає метод стратегії. 2. Щоб **позбутися безлічі** `if-else` **/** `switch` **конструкцій**, де вручну обирається, який спосіб використовувати. 3. Щоб **легко додавати нові алгоритми**, не змінюючи наявний код (принцип *Open/Closed*). 4. Щоб **підміняти поведінку під час виконання** - наприклад, змінювати стратегію оплати, сортування чи логування "на льоту". --- ### 5. **Переваги** - Послаблює зв'язаність між контекстом і алгоритмами. - Робить код розширюваним: нові стратегії додаються без зміни старих. - Дозволяє змінювати поведінку динамічно. --- ### 6. **Недоліки** - Збільшується кількість класів (по одному на кожну стратегію). - Контексту потрібно знати, **коли і яку стратегію обрати**. --- ### **Висновок** Патерн **Strategy** дозволяє: - інкапсулювати різні алгоритми, - зробити їх взаємозамінними, - позбавити код умовних конструкцій, - і динамічно змінювати поведінку об'єкта. **Підсумок:** > Strategy - це спосіб **вибору алгоритму під час виконання** > без зміни коду, який цей алгоритм використовує.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.