Gymterview
junior

Что такое паттерн Observer?

Observer – паттерн, определяющий зависимость “один ко многим” между объектами: при изменении состояния одного все зависимые уведомляются автоматически.

Аналогия из жизни: Observer – как подписка на Telegram-канал. Автор публикует пост, и все подписчики получают уведомление. Подписчики не опрашивают канал – уведомление приходит само.

Пример реализации
interface EventListener<T> {
    void onEvent(T event);
}

class EventBus<T> {
    private final List<EventListener<T>> listeners = new CopyOnWriteArrayList<>();

    void subscribe(EventListener<T> listener) { listeners.add(listener); }
    void unsubscribe(EventListener<T> listener) { listeners.remove(listener); }

    void publish(T event) {
        listeners.forEach(listener -> listener.onEvent(event));
    }
}

// Использование
EventBus<OrderCreatedEvent> bus = new EventBus<>();
bus.subscribe(event -> emailService.sendConfirmation(event));
bus.subscribe(event -> analyticsService.track(event));
bus.publish(new OrderCreatedEvent(orderId));

Важное

  • Observer – основа event-driven архитектуры
  • Spring Events (ApplicationEventPublisher) – Observer из коробки
  • CopyOnWriteArrayList – потокобезопасный список подписчиков

Частые ошибки

  • Утечки памяти – подписчик не отписывается; в Java нет weak listeners по умолчанию
  • Синхронный Observer для тяжёлых операций – блокирует publisher; используйте @Async или очереди

Как используется в 2026

  • Spring @EventListener / @TransactionalEventListener – стандартная реализация
  • Kafka, RabbitMQ – Observer на уровне распределённой системы

На собеседовании: интервьюер ждёт связь Observer с event-driven архитектурой и Spring Events. Частая ошибка – не упомянуть проблему утечек памяти при забытой отписке подписчиков.