Паттерн "Наблюдатель" в 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.
См. также
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Паттерн — это повторяющийся шаблон, узор или схема. Паттерны встречаются повсюду — в природе, архитектуре, поведении людей и, конечно, в программировании. Порождающие паттерны проектирования — это группа шаблонов, направленных на решение задач, связанных с созданием объектов. Структурные паттерны — это группа шаблонов проектирования, решающих задачи организации классов и объектов таким образом, чтобы обеспечить гибкую архитектуру программного обеспечения. Поведенческие паттерны — это группа шаблонов проектирования, которые определяют способы взаимодействия объектов и распределения ответственности между ними. Архитектурные паттерны — это проверенные решения для организации структуры программного обеспечения. Интеграция систем — одна из центральных задач в современной разработке программного обеспечения. Паттерны доменного моделирования представляют собой проверенные решения для организации бизнес-логики в программных системах. Паттерн Strategy в C# — классическая реализация через интерфейс, замена на Func и Action, DI и критерии выбора без лишних абстракций. Паттерн Iterator в C# — ручной IEnumerator, генерация итератора компилятором через yield return, ленивость, LINQ и случаи, когда класс писать всё же нужно. Abstract Factory в C# и .NET — классическая схема через интерфейсы, замена через DI-контейнер, фабричный делегат и keyed services в .NET 8. Паттерн Command в C# — классическая схема, делегаты, MediatR, очередь задач, undo и критерии выбора между объектом команды и простым вызовом сервиса. Паттерн Observer в C# — event и делегаты, IObservable IObserver, слабая связанность, отписка и как не поймать утечки памяти в долгоживущих сервисах.Обзор паттернов проектирования
Порождающие паттерны
Структурные паттерны
Поведенческие паттерны
Архитектурные паттерны
Паттерны интеграции внешних систем
Паттерны проектирования доменных моделей
Стратегия в C#
Итератор в C#
Фабрика в C#
Команда в C#
Наблюдатель в C#