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. Частая ошибка – не упомянуть проблему утечек памяти при забытой отписке подписчиков.