Что такое паттерн Стратегия и в каких случаях его стоит применять

Ответ

Паттерн Стратегия (Strategy) — это поведенческий паттерн проектирования, который позволяет определять семейство схожих алгоритмов и инкапсулировать каждый из них в отдельный класс. Это даёт возможность взаимозаменять алгоритмы прямо во время выполнения программы.

Его применяют, когда:

  • Есть несколько вариантов одного алгоритма, и нужно переключаться между ними в рантайме.
  • Необходимо изолировать логику алгоритмов от клиентского кода, который их использует.
  • Нужно избежать множества условных операторов (if-elif-else) для выбора поведения.

Пример на Python: Система оплаты с разными способами (карта, PayPal).

from abc import ABC, abstractmethod

# 1. Интерфейс Стратегии
class PaymentStrategy(ABC):
    @abstractmethod
    def pay(self, amount: int):
        pass

# 2. Конкретные Стратегии
class CreditCardPayment(PaymentStrategy):
    def pay(self, amount: int):
        print(f"Оплачено {amount} руб. с помощью кредитной карты.")

class PayPalPayment(PaymentStrategy):
    def pay(self, amount: int):
        print(f"Оплачено {amount} руб. через PayPal.")

# 3. Контекст, который использует Стратегию
class PaymentContext:
    def __init__(self, strategy: PaymentStrategy):
        self._strategy = strategy

    def set_strategy(self, strategy: PaymentStrategy):
        self._strategy = strategy

    def execute_payment(self, amount: int):
        self._strategy.pay(amount)

# Использование
cart = PaymentContext(CreditCardPayment())
cart.execute_payment(1000)
# > Оплачено 1000 руб. с помощью кредитной карты.

# Динамическая смена стратегии
cart.set_strategy(PayPalPayment())
cart.execute_payment(500)
# > Оплачено 500 руб. через PayPal.

Преимущества:

  • Гибкость: Позволяет добавлять новые алгоритмы, не изменяя клиентский код.
  • Изоляция: Логика алгоритмов отделена от основной бизнес-логики.
  • Читаемость: Устраняет сложные условные конструкции.