Что такое Observer

Ответ

Observer — это поведенческий паттерн проектирования, который создаёт механизм подписки, позволяющий одним объектам (наблюдателям) следить и реагировать на изменения в другом объекте (субъекте).

Пример:

class Subject {
  constructor() {
    this.observers = [];
  }

  subscribe(observer) {
    this.observers.push(observer);
  }

  unsubscribe(observer) {
    this.observers = this.observers.filter(obs => obs !== observer);
  }

  notify(data) {
    this.observers.forEach(observer => observer.update(data));
  }
}

class Observer {
  update(data) {
    console.log('Получены данные:', data);
  }
}

const subject = new Subject();
const observer = new Observer();

subject.subscribe(observer);
subject.notify('Новое событие!'); // Выведет: "Получены данные: Новое событие!"

Используется:

  • Реактивные системы (например, Vue, React)
  • Событийные модели (например, DOM Events)
  • Pub/Sub системы

Плюсы:

  • Гибкость (легко добавлять/удалять наблюдателей)
  • Снижение связанности (субъект не знает детали наблюдателей)

Минусы:

  • Неожиданные обновления (если цепочка вызовов сложная)
  • Потенциальные утечки памяти (если не отписаться)

Ответ 18+ 🔞

Так, слушай сюда, про этот ваш Observer, паттерн такой. Ну, в общем, это как если бы ты сидел на кухне, а у тебя соседка Марья Ивановна, сука, каждые пять минут в окно выглядывает — проверить, не приехала ли её посылка. Вот она у тебя — субъект, понимаешь? А ты у себя на кухне — наблюдатель, который каждый раз, блядь, вздрагиваешь, когда эта мартышлюшка штору дёргает.

Короче, технически:

Есть объект-субъект — он как эта самая Марья Ивановна, у которой что-то происходит (посылка приехала, или там кот с балкона спрыгнул). И есть куча наблюдателей — это мы, соседи, которые, блядь, подписаны на её движуху. Как только что-то случается — субъект орет на весь двор: «Котик-то мой, блядь, спрыгнул!». А все наблюдатели, которые на это подписаны, сразу такие: «Ага, получили данные, щас побежим смотреть».

Вот, смотри, как в коде:

class Subject {
  constructor() {
    this.observers = []; // Тут список всех подписчиков, типа наш список соседей-любопытных
  }

  subscribe(observer) {
    this.observers.push(observer); // Новый сосед приехал, тоже хочет знать про кота
  }

  unsubscribe(observer) {
    this.observers = this.observers.filter(obs => obs !== observer); // Этот сосед съехал, похуй на его мнение
  }

  notify(data) {
    this.observers.forEach(observer => observer.update(data)); // Кричим на весь двор: «Данные пришли!»
  }
}

class Observer {
  update(data) {
    console.log('Получены данные:', data); // А наблюдатель такой: «Ага, щас гляну, что там»
  }
}

const subject = new Subject();
const observer = new Observer();

subject.subscribe(observer);
subject.notify('Новое событие!'); // Выведет: "Получены данные: Новое событие!"

Где это, блядь, применяется?

Да везде, ёпта! Во всех этих ваших модных фреймворках — Vue, React. Ты ж помнишь, как там интерфейс обновляется, когда данные меняются? Это оно и есть, сука! Или вот браузерные события — кликнул по кнопке, а тебе десять обработчиков сработало. Pub/Sub системы — тоже из этой оперы.

Плюсы, минусы, как всегда:

Плюсы в том, что гибко, блядь. Хочешь — подписался на соседку, хочешь — отписался. Субъекту вообще похуй, кто там слушает — он просто орёт в пространство.

А минусы… Ну, как обычно. Может так получиться, что ты отписался, а тебе всё равно нотификации лезут — утечка памяти, ёбта. Или цепочка вызовов такая, что в итоге все наблюдатели друг другу мешают, и получается пиздец, а не система. Но это если криворуко делать, конечно.

Короче, паттерн полезный, но без фанатизма, а то опять соседка начнёт каждую минуту уведомления слать про своего кота.