В чем разница между Observer и Publisher Subscriber?
Продвинутые темы
Observer и Publisher-Subscriber (Pub/Sub) — паттерны уведомления об изменениях, но в Observer субъект напрямую знает наблюдателей, а в Pub/Sub есть посредник (шина событий), и издатель с подписчиком не знают друг о друге.
Observer
Субъект напрямую хранит список наблюдателей и уведомляет их:
subject.subscribe(observer);
subject.notify(data); // субъект сам вызывает наблюдателей- Прямая связь субъект ↔ наблюдатели.
- Субъект знает о наблюдателях.
- Синхронно (обычно).
Publisher-Subscriber (Pub/Sub)
Между издателем и подписчиком — посредник (event bus / broker). Издатель публикует в канал, подписчики слушают канал; друг о друге они не знают:
eventBus.subscribe('user:login', handler);
eventBus.publish('user:login', data); // издатель не знает подписчиков- Развязка через посредника.
- Издатель и подписчик не знают друг о друге.
- Часто асинхронно, по «топикам»/каналам.
Различия
- Связанность: Observer — прямая (субъект знает наблюдателей); Pub/Sub — через посредника (не знают друг о друге).
- Развязка: Pub/Sub слабее связывает компоненты.
- Масштаб: Pub/Sub удобен для распределённых систем, микросервисов, шины событий.
Примеры
- Observer: MobX, реактивность,
addEventListener. - Pub/Sub: event bus, Redis Pub/Sub, message brokers (Kafka), EventEmitter как шина.
Коротко для собеседования
Observer — субъект напрямую знает наблюдателей и уведомляет их (прямая связь). Pub/Sub — издатель и подписчик общаются через посредника (шину/канал), не зная друг о друге (слабее связаны). Observer — для реактивности внутри приложения, Pub/Sub — для развязки и распределённых систем.