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

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

Разработчику Архитектору

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

Загрузка редактора схем…

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

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


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

import java.util.ArrayList;
import java.util.List;

record OrderEvent(String orderId, String status) {}

interface OrderListener {
void onOrderStatusChanged(OrderEvent event);
}

class OrderService {
private final List<OrderListener> listeners = new ArrayList<>();

void subscribe(OrderListener listener) {
listeners.add(listener);
}

void changeStatus(String orderId, String newStatus) {
OrderEvent event = new OrderEvent(orderId, newStatus);
listeners.forEach(l -> l.onOrderStatusChanged(event));
}
}

class WarehouseListener implements OrderListener {
@Override
public void onOrderStatusChanged(OrderEvent event) {
if ("PAID".equals(event.status())) {
System.out.println("Склад: начать сборку " + event.orderId());
}
}
}

class AnalyticsListener implements OrderListener {
@Override
public void onOrderStatusChanged(OrderEvent event) {
System.out.println("Аналитика: статус " + event.status());
}
}
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.


См. также

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").