Что такое паттерн Observer?
Продвинутые темы
Паттерн Observer (наблюдатель) — это поведенческий паттерн, в котором объект (субъект) хранит список подписчиков и уведомляет их об изменениях своего состояния.
Идея
Один объект (subject/publisher) публикует события, много объектов (observers/subscribers) на них подписаны и реагируют. Субъект не знает деталей подписчиков — слабая связанность.
class Subject {
#observers = new Set();
subscribe(fn) { this.#observers.add(fn); return () => this.#observers.delete(fn); }
notify(data) { this.#observers.forEach((fn) => fn(data)); }
}
const subject = new Subject();
const unsub = subject.subscribe((d) => console.log('получил', d));
subject.notify('событие'); // все подписчики уведомлены
unsub(); // отпискаГде встречается
- DOM-события —
addEventListener(подписка на события элемента). - Реактивность — стор уведомляет UI об изменениях (Redux subscribe, RxJS, Vue reactivity).
- EventEmitter в Node.js.
Observer против Pub/Sub
- Observer — субъект напрямую знает подписчиков.
- Pub/Sub — через посредника (шину событий), издатель и подписчик не знают друг о друге.
Коротко для собеседования
Observer — паттерн, где субъект хранит подписчиков и уведомляет их об изменениях (subscribe/notify). Слабо связывает объекты. Основа DOM-событий, реактивных сторов и EventEmitter. Отличается от Pub/Sub наличием прямой связи субъект-наблюдатель.