PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

В чем разница между 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 — для развязки и распределённых систем.

Другие вопросы раздела