Что такое паттерн стратегия
Что проверяют
Знаете ли вы классический паттерн и умеете ли применять его по-современному: интерфейс с одним методом в Java это функциональный интерфейс, и три класса ради трёх строк никто не пишет. Попутно проверяют понимание композиции против наследования и связь с тестируемостью.
Как отвечать
Стратегия определяет семейство взаимозаменяемых алгоритмов за общим интерфейсом и позволяет подменять их независимо от кода, который ими пользуется. Контекст держит ссылку на интерфейс, конкретная реализация приходит снаружи: через конструктор, сеттер или контейнер внедрения зависимостей.
interface Discount {
long apply(long amount);
}
class Order {
private final Discount discount;
Order(Discount discount) {
this.discount = discount;
}
long total(long amount) {
return discount.apply(amount);
}
}
Order order = new Order(amount -> amount * 9 / 10);Что добавить для сильного ответа: интерфейс с единственным методом реализуется лямбдой или ссылкой на метод; фиксированный набор стратегий удобно держать в enum, где каждая константа переопределяет метод; в приложении на Spring все реализации инжектятся сразу как коллекция или как отображение имени бина на реализацию, и выбор сводится к поиску по ключу без ветвления.
Где спотыкаются
Утверждают, что при смене алгоритма приходится править контекст. Всё наоборот: контекст знает только интерфейс, выбор делает вызывающая сторона или фабрика. Если ради новой стратегии меняется контекст, паттерн собран неправильно и выгоды от него нет.
Плодят классы под каждую мелочь и получают десяток файлов вместо одного. В современной Java цена стратегии близка к нулю, пока она остаётся лямбдой или константой перечисления; полноценный класс заводят, когда у алгоритма появляются зависимости или состояние.
Не могут отличить от переопределения метода в наследнике и от шаблонного метода, а на вопрос про пользу отвечают общими словами про гибкость. Сильный аргумент проще: стратегия подменяется в тесте прямо в конструкторе, без мок-фреймворка и без подмены статики.