Паттерн "Наблюдатель" в Java — подписчики и ApplicationEvent
Модель и масштаб — Основы БД, опорные темы, проектирование БД, пакетная работа. Карта — о разделе.
Обзор — в поведенческих паттернах. Практика на 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.
См. также
- Поведенческие паттерны — Наблюдатель
- Наблюдатель в C#
- Посредник в Java
- pub/sub и event-driven — брокеры, типы взаимодействия