Стратегия прячет семейство взаимозаменяемых алгоритмов за общим интерфейсом. Клиент (контекст) хранит стратегию и делегирует ей работу, поэтому алгоритм можно выбрать или заменить, не меняя клиента. Это объектный ответ на растущую цепочку if/elif.

Проблема: цепочка if

Здесь сумма заказа зависит от вида скидки. Каждая новая скидка правит total, а опечатка в kind проявляется только во время работы. Функция знает все алгоритмы, поэтому нарушается принцип открытости/закрытости.

python
def total(items, kind, value=0):
    amount = sum(items)
    if kind == "none":
        return amount
    elif kind == "percent":
        return amount * (100 - value) // 100
    elif kind == "fixed":
        return max(amount - value, 0)
    raise ValueError(kind)

print(total([40, 60, 50], "percent", 10), total([40, 60, 50], "fixed", 30))
text
135 120

Стратегии-классы

`Order` хранит стратегию `Discount`; три класса её реализуют
Order хранит стратегию Discount; три класса её реализуют

Каждый алгоритм становится классом с одним методом apply. Order вызывает self.discount.apply(...) и не проверяет, какая у него скидка. Новая скидка — новый класс, Order не меняется. Стратегию можно заменить и позже: order.discount = Fixed(30).