Как реализовать поведение персонажа с разной скоростью в зависимости от времени без if и switch в Java? Какой паттерн использовать?
Что проверяют
Умеете ли вы убрать ветвление, не спрятав его в другое место. Назвать «Стратегию» мало: интервьюер ждёт, кто и как выбирает стратегию по времени. Следом почти всегда спрашивают, чем Strategy отличается от State и как это тестировать.
Как отвечать
Базовая часть: интерфейс MovementStrategy с методом double speed(), реализации DayMovement, NightMovement, RushMovement, персонаж хранит ссылку на текущую стратегию и делегирует ей движение. Новое поведение добавляется новым классом, без правки старых, это принцип открытости из SOLID.
Главное: как выбрать стратегию без if. Выбор переносится в данные:
TreeMap<LocalTime, MovementStrategy>: ключи это начала интервалов, аfloorEntry(now).getValue()возвращает стратегию для текущего времени. Нужен ключLocalTime.MIDNIGHT, иначе для раннего времениfloorEntryвернётnull;enumс поведением: каждая константаDAY,NIGHTхранит свой интервал и переопределяет абстрактный метод скорости. Это тот же Strategy, только компактнее;- State: если режим меняется по ходу игры (разгон, усталость, бонус на 10 секунд), каждое состояние само решает, в какое перейти дальше. Персонаж вызывает
state = state.next(elapsed)и не знает всех вариантов.
Разница, которую стоит сформулировать: стратегию выбирают снаружи, а состояние переключает себя само. Время лучше не брать через LocalTime.now() внутри логики, а передавать java.time.Clock или игровое время параметром. Тогда тест подставит Clock.fixed(...) и проверит ночную скорость без ожидания ночи.
Где спотыкаются
Показывают Strategy с ручным setMovementBehavior(new FastMovement()) и считают задачу решённой. Вопрос о том, кто вызывает этот сеттер по времени, остаётся без ответа, а именно там и сидит тот самый if.
Заменяют if на switch по enum или на тернарный оператор. Формально условия нет, по сути ничего не изменилось.
Путают Strategy и State и не могут объяснить, почему здесь уместнее одно или другое. Хороший ответ: фиксированные интервалы суток дают таблицу стратегий, а переходы со своей логикой дают State.