Что такое паттерн стратегия
Что проверяют
Понимаете ли вы, какую задачу решает паттерн, а не только его схему из книги. И отдельно: знаете ли питоновский вариант, где стратегия это обычно вызываемый объект, а не иерархия классов.
Как отвечать
Стратегия это поведенческий паттерн: семейство взаимозаменяемых алгоритмов выносится за границу объекта, который ими пользуется. Контекст знает только контракт вызова, конкретный алгоритм подставляется снаружи (в конструктор, в атрибут, параметром функции). Новый алгоритм добавляется новой реализацией, код контекста не трогается.
В Python контракт это вызываемое: функция, замыкание, метод, частично применённый вызов. Абстрактный базовый класс нужен, когда у стратегии несколько методов или собственное состояние.
def by_price(items):
return sorted(items, key=lambda i: i.price)
def by_rating(items):
return sorted(items, key=lambda i: -i.rating)
SORTERS = {"price": by_price, "rating": by_rating}
def render(items, kind):
return SORTERS[kind](items)Где реально применяется: ранжирование выдачи, политики повторов и бэкоффа, способы расчёта скидки, парсеры под разные форматы выгрузки, выбор хранилища. Признак, что паттерн уместен: разросшийся if/elif по типу, который меняется чаще остального кода.
Где спотыкаются
Пересказывают диаграмму и не могут назвать задачу. Стратегия оправдана, когда алгоритмов несколько и они множатся; ради двух стабильных веток условия она добавляет только файлов и прыжков по коду.
Тащат абстрактный класс и три наследника туда, где хватает функции в словаре. Интервьюер спрашивает про питоновский способ, а кандидат отвечает, что без интерфейса паттерна не бывает.
Путают с соседями. В State объект сам знает переходы и меняет своё состояние, а стратегию выбирает вызывающая сторона. Шаблонный метод строится на наследовании и подменяет шаги скелета, стратегия строится на композиции. Заодно называют стратегией обычный флаг: параметр сортировки это аргумент, а не отдельный алгоритм.