Ответ
Паттерн Стратегия (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.
Преимущества:
- Гибкость: Позволяет добавлять новые алгоритмы, не изменяя клиентский код.
- Изоляция: Логика алгоритмов отделена от основной бизнес-логики.
- Читаемость: Устраняет сложные условные конструкции.