Ответ
Паттерн «Стратегия» (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): Для создания соответствующего объекта-стратегии, что часто используется в паре со Стратегией.