Что такое паттерн стратегия
Что проверяют
Умеете ли вы выносить взаимозаменяемые алгоритмы за границу протокола и понимаете ли, что в Swift для этого не всегда нужен отдельный класс. Интервьюер заодно смотрит, отличаете ли вы стратегию от состояния и не превращаете ли паттерн в набор пустых типов.
Как отвечать
Стратегия это семейство алгоритмов с общим интерфейсом, взаимозаменяемых во время выполнения. Контекст хранит выбранный вариант и делегирует ему работу, ничего не зная о реализации.
protocol PriceRule {
func total(for items: [Item]) -> Decimal
}
struct NoDiscount: PriceRule { ... }
struct LoyaltyRule: PriceRule { let rate: Decimal }
final class Cart {
var rule: PriceRule = NoDiscount()
func total() -> Decimal { rule.total(for: items) }
}Отдельно скажите про идиоматику языка: часто стратегию достаточно выразить значением, то есть свойством с типом функции, и тогда конкретный вариант это замыкание, а тест подставляет своё. Протокол берут, когда у стратегии есть собственное состояние, несколько методов или её нужно внедрять и называть по имени типа.
Примеры из iOS звучат убедительнее теории: правила валидации полей, политики повторов и кэширования в сетевом слое, разные варианты раскладки у коллекции, форматирование под локаль, выбор реализации под флаг функциональности.
Где спотыкаются
Путают со состоянием. Стратегию задаёт клиент снаружи, и варианты друг о друге не знают; состояния переключают сами себя и описывают граф переходов. Вопрос про эту разницу задают почти всегда.
Разводят церемонию на пустом месте: протокол с одним методом и пять классов там, где хватило бы перечисления или замыкания. Бывает и обратное, когда все варианты сваливают в один тип с флагами и ветвлениями, а потом жалуются, что его невозможно тестировать.
Протаскивают в протокол детали одной реализации: параметры, нужные только ей, или необязательные методы для особых случаев. Контекст снова начинает знать, кто внутри, и появляется проверка типа перед вызовом, что убивает всю идею взаимозаменяемости.