Observer — это поведенческий паттерн, который создаёт механизм подписки, позволяя одним объектам следить за изменениями в других.
Простыми словами: как подписка на Telegram-канал — когда выходит новый пост, все подписчики получают уведомление автоматически.
▪️ Пример:
Сервис обработки заказов: при смене статуса нужно уведомить склад, аналитику и клиента. Вместо жёстких вызовов — подписка.
// Событие
record OrderEvent(String orderId, String status) {}
// Подписчик
interface OrderListener {
void onOrderStatusChanged(OrderEvent event);
}
// Издатель
class OrderService {
private final List<OrderListener> listeners = new ArrayList<>();
public void subscribe(OrderListener listener) {
listeners.add(listener);
}
public void changeStatus(String orderId, String newStatus) {
// бизнес-логика...
OrderEvent event = new OrderEvent(orderId, newStatus);
listeners.forEach(l -> l.onOrderStatusChanged(event));
}
}
// Конкретные подписчики
class WarehouseListener implements OrderListener {
public void onOrderStatusChanged(OrderEvent event) {
if ("PAID".equals(event.status())) {
System.out.println("Склад: начать сборку " + event.orderId());
}
}
}
class AnalyticsListener implements OrderListener {
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");
// Склад: начать сборку ORD-42
// Аналитика: статус PAID
▪️ Когда использовать
— Изменение одного объекта требует обновления других, и набор зависимых объектов заранее неизвестен
— Хотите избежать жёсткой связи между компонентами
— В Spring: ApplicationEventPublisher — встроенный Observer
▪️ Минус
Подписчики оповещаются в непредсказуемом порядке; утечки памяти, если забыть отписаться.
🐸 Библиотека собеса по Java
#patterns