Какой паттерн проектирования использовать для изменения поведения объекта в зависимости от времени суток?

«Какой паттерн проектирования использовать для изменения поведения объекта в зависимости от времени суток?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Паттерн «Стратегия» (Strategy) — это оптимальный выбор для данной задачи. Он позволяет инкапсулировать различные алгоритмы поведения (для утра, дня, вечера) в отдельные классы и делать их взаимозаменяемыми.

Преимущества:

  • Устранение условных операторов: Избавляет основной код от множества if-else или switch конструкций.
  • Принцип открытости/закрытости (Open/Closed): Легко добавить новую стратегию (например, для ночи), не изменяя существующий контекст.
  • Четкое разделение ответственности: Каждая стратегия отвечает только за свою логику.

Пример реализации на Java:

// 1. Интерфейс стратегии
interface GreetingStrategy {
    String generateGreeting();
}

// 2. Конкретные стратегии
class MorningGreetingStrategy implements GreetingStrategy {
    @Override
    public String generateGreeting() {
        return "Good morning! Have a productive day.";
    }
}

class EveningGreetingStrategy implements GreetingStrategy {
    @Override
    public String generateGreeting() {
        return "Good evening! Time to relax.";
    }
}

// 3. Контекст, который использует стратегию
class GreetingContext {
    private GreetingStrategy strategy;

    public void setStrategy(GreetingStrategy strategy) {
        this.strategy = strategy;
    }

    public void executeGreeting() {
        String message = strategy.generateGreeting();
        System.out.println(message);
    }
}

// 4. Клиентский код
public class Client {
    public static void main(String[] args) {
        GreetingContext context = new GreetingContext();
        LocalTime now = LocalTime.now();

        if (now.isBefore(LocalTime.NOON)) {
            context.setStrategy(new MorningGreetingStrategy());
        } else {
            context.setStrategy(new EveningGreetingStrategy());
        }
        context.executeGreeting(); // Поведение меняется динамически
    }
}

Альтернативы и когда их использовать:

  • Состояние (State): Если изменение поведения связано с внутренним состоянием самого объекта, а не внешним контекстом (время суток — внешний контекст).
  • Фабричный метод (Factory Method): Для создания соответствующего объекта-стратегии, что часто используется в паре со Стратегией.