Вопрос проверяет понимание практической реализации паттерна Observer и умение применять его без фреймворков.
Observer реализуется через хранение списка подписчиков и механизм их уведомления. Наблюдатели подписываются на источник событий и получают уведомления при изменении состояния. Реализация может быть синхронной или асинхронной. В Java это часто делается через интерфейсы.
Реализация Observer строится вокруг явного контракта между источником событий и подписчиками.
Источник событий хранит список наблюдателей и уведомляет их при изменениях.
Это позволяет добавлять и удалять подписчиков без изменения логики источника.
Сначала определяются интерфейсы.
Интерфейс наблюдателя
public interface Observer {
void update(String event);
}
Источник событий
public class Subject {
private List<Observer> observers = new ArrayList<>();
public void subscribe(Observer observer) {
observers.add(observer);
}
public void notifyObservers(String event) {
for (Observer observer : observers) {
observer.update(event);
}
}
}
Конкретный наблюдатель
public class EmailObserver implements Observer {
public void update(String event) {
// обработка события
}
}
На практике часто используют:
Колбэки
Event Bus
Реактивные библиотеки
Встроенные механизмы фреймворков
Observer легко реализуется вручную, но в сложных системах обычно применяют готовые инструменты для управления событиями и асинхронностью.