Поведенческие (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: один объект сообщает «что-то произошло», а другие реагируют, не будучи жёстко связанными друг с другом.
• идею Observer — подписка и уведомление, и где она встречается (если дошёл до 2-го слоя).