Перейти к основному содержимому

Паттерн "Наблюдатель" в Java — подписчики и ApplicationEvent

Разработчику Архитектору
Теория данных (раздел 3)

Обзор — в поведенческих паттернах. Практика на C# (event, IObservable) — в Наблюдатель в C#. Здесь — Observer на Java без жёстких вызовов между модулями.

Play ITЗагрузка интерактивного демо…


Задача паттерна

Observer строит подписку "один ко многим": при изменении состояния издатель уведомляет всех подписчиков. Аналогия — канал в мессенджере: вышел пост — все подписчики получили уведомление.


Пример — статус заказа

Код ITЗагрузка примера кода…

OrderService service = new OrderService();
service.subscribe(new WarehouseListener());
service.subscribe(new AnalyticsListener());
service.changeStatus("ORD-42", "PAID");

Observer в Spring

В Spring Boot встроенный Observer — ApplicationEventPublisher и @EventListener: доменное событие публикуется, обработчики подключаются декларативно. См. обзор Spring.

Исторический java.util.Observer / Observable устарели (deprecated) — в новом коде списки слушателей, события Spring или reactive streams.


Когда применять и риски

СитуацияObserver
Набор реакций на событие заранее не фиксированПодписчики добавляются без правок издателя
Слабая связность модулейСклад и аналитика не знают друг о друге

Минусы

  • Порядок вызова подписчиков может быть непредсказуемым.
  • Утечки памяти, если долгоживущий издатель держит ссылки на отписанных слушателей — нужна явная unsubscribe.

Сложная маршрутизация "кто кому пишет" — скорее Mediator, а не Observer.


См. также