Що робить патерн Strategy і навіщо він потрібен?
Патерн Strategy (Стратегія) призначений для інкапсуляції різних алгоритмів поведінки і можливості підміняти їх під час виконання, не змінюючи код самого об'єкта, який ці алгоритми використовує.
1. Суть ідеї
Коли об'єкту потрібно виконувати якусь дію (наприклад, сортування, оплату, логування), але спосіб виконання може змінюватися, - ці способи виділяються в окремі класи.
Об'єкт делегує виконання алгоритму стратегії, а не вирішує всередині себе, який саме спосіб використовувати.
Таким чином, алгоритми стають взаємозамінними і незалежними.
2. Учасники патерна
- Context (Контекст) - об'єкт, який використовує стратегію. Він зберігає посилання на поточну стратегію і викликає її методи.
- Strategy (Інтерфейс стратегії) - спільний інтерфейс усіх алгоритмів.
- ConcreteStrategy (Конкретні стратегії) - різні реалізації однієї й тієї самої поведінки.
3. Приклад (Java)
Приклад: система оплати, де можна платити карткою або PayPal.
// Спільний інтерфейс стратегій
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);
}
}Використання:
Order order1 = new Order(new CreditCardPayment());
order1.checkout(100); // Оплата через картку
Order order2 = new Order(new PayPalPayment());
order2.checkout(200); // Оплата через PayPal4. Навіщо потрібен
- Щоб розділити вибір алгоритму і його реалізацію. Контекст не знає, як саме працює алгоритм - він просто викликає метод стратегії.
- Щоб позбутися безлічі
if-else/switchконструкцій, де вручну обирається, який спосіб використовувати. - Щоб легко додавати нові алгоритми, не змінюючи наявний код (принцип Open/Closed).
- Щоб підміняти поведінку під час виконання - наприклад, змінювати стратегію оплати, сортування чи логування "на льоту".
5. Переваги
- Послаблює зв'язаність між контекстом і алгоритмами.
- Робить код розширюваним: нові стратегії додаються без зміни старих.
- Дозволяє змінювати поведінку динамічно.
6. Недоліки
- Збільшується кількість класів (по одному на кожну стратегію).
- Контексту потрібно знати, коли і яку стратегію обрати.
Висновок
Патерн Strategy дозволяє:
- інкапсулювати різні алгоритми,
- зробити їх взаємозамінними,
- позбавити код умовних конструкцій,
- і динамічно змінювати поведінку об'єкта.
Підсумок:
Strategy - це спосіб вибору алгоритму під час виконання без зміни коду, який цей алгоритм використовує.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.