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

Ответ

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

Ответ 18+ 🔞

А, паттерн «Стратегия»! Ну это ж классика, блядь, как «Муму» Тургенева, только без утоплений, слава богу. Слушай, смотри, в чём суть-то, ёпта.

Представь себе, у тебя есть объект, а у него поведение, которое должно меняться. Как у того Герасима, блядь: утром он мог бы говорить «Му-у» (доброе утро), днём — «У-у-у» (работай, падла), вечером — «...» (устал, бля). Но он немой, ему сложно. А нам — легко!

Вот этот паттерн как раз про то, чтобы вынести всю эту пляску с бубном, все эти if (утро) {...} else if (день) {...} else if (вечер) {...} в отдельные, блядь, классы-стратегии. Чтобы основной код не превращался в помойку из условий, а был красивым, как... ну, как я после бани.

И зачем это всё, спросишь? Да затем, сука!

  • Убрать эти ебучие if-else. Ну реально, надоели они, как мартышлюшка на шее. Заменил их на выбор стратегии — и в рот меня чих-пых, красота!
  • Принцип «открыт-закрыт». Хочешь добавить приветствие для ночи, когда все уже в отключке? Пожалуйста, блядь! Пишешь новый класс NightGreetingStrategy, а весь остальной код даже не чихнет. Не надо лезть в старый, проверенный код и там всё ебашить.
  • Разделение ответственности. Каждая стратегия — как отдельный работник. Один отвечает за утро, другой — за вечер. Не лезут друг другу в тарелки, не путаются под ногами. Идеальный порядок, блядь!

Смотри, как это выглядит в коде, на примере приветствий:

// 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-else! Но тут он уже не страшный, он просто выбирает стратегию.
        if (now.isBefore(LocalTime.NOON)) {
            context.setStrategy(new MorningGreetingStrategy()); // Утро — утренняя стратегия
        } else {
            context.setStrategy(new EveningGreetingStrategy()); // Не утро — вечерняя
        }
        context.executeGreeting(); // Блядь, и оно само говорит то, что нужно!
    }
}

А что, есть альтернативы? Конечно, ебать! Но они для других случаев.

  • Состояние (State): Его юзают, когда поведение меняется из-за внутреннего состояния самого объекта. Типа объект «заблокирован», «активен», «в ауте». А у нас-то время суток — это внешний фактор, пиздец.
  • Фабричный метод (Factory Method): Его часто, сука, со Стратегией в паре гоняют. Фабрика может создавать нужный объект-стратегию, чтобы клиентский код вообще не парился, какой класс создавать. Красота, блядь!

В общем, Стратегия — это овердохуище полезная штука, когда нужно менять алгорытмы на лету. Как смена декораций в театре, только без этих ёбанных актёров, которые вечно бухают.