Карта / Паттерны проектирования / Поведенческие (Strategy, Observer)

Поведенческие (Strategy, Observer)

Поведенческие паттерны решают вопрос «как объекты взаимодействуют и распределяют ответственность». Два самых частых — Strategy и Observer.

Strategy — позволяет менять алгоритм/поведение “на лету”, без if-else на каждый случай:

interface DiscountStrategy { int apply(int price); }

class NoDiscount implements DiscountStrategy {
    public int apply(int price) { return price; }
}
class BlackFridayDiscount implements DiscountStrategy {
    public int apply(int price) { return price / 2; }
}

class Order {
    private DiscountStrategy discount;
    Order(DiscountStrategy discount) { this.discount = discount; }
    int finalPrice(int price) { return discount.apply(price); }   // нет ни одного if
}

Observer — объекты подписываются на события другого объекта и автоматически уведомляются, когда что-то происходит:

interface OrderListener { void onOrderCreated(Order order); }

class EmailNotifier implements OrderListener {
    public void onOrderCreated(Order order) { /* отправить письмо */ }
}

class OrderService {
    private final List<OrderListener> listeners = new ArrayList<>();
    void subscribe(OrderListener listener) { listeners.add(listener); }
    void createOrder() {
        // ... логика создания заказа ...
        listeners.forEach(l -> l.onOrderCreated(order));   // уведомить всех подписчиков
    }
}
Копнуть глубже

Strategy убирает цепочки if-else/switch по типу поведения. Без него код часто выглядит так:

if (discountType == BLACK_FRIDAY) { ... }
else if (discountType == NEW_YEAR) { ... }
else { ... }

Каждый новый вид скидки требует менять этот метод. Со Strategy — просто добавляешь новый класс, ничего существующего не трогаешь (это и есть принцип Open/Closed из SOLID — см. тему «O, L, I, D»).

Observer лежит в основе событийных систем. Spring ApplicationEvent/@EventListener, слушатели в JavaScript (addEventListener), подписки в реактивном программировании — всё это вариации Observer: один объект сообщает «что-то произошло», а другие реагируют, не будучи жёстко связанными друг с другом.

🎤 Закрыл тему, если можешь объяснить:
• как Strategy заменяет цепочку if-else на полиморфизм;
• идею Observer — подписка и уведомление, и где она встречается (если дошёл до 2-го слоя).