Ответ
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 системы — тоже из этой оперы.
Плюсы, минусы, как всегда:
Плюсы в том, что гибко, блядь. Хочешь — подписался на соседку, хочешь — отписался. Субъекту вообще похуй, кто там слушает — он просто орёт в пространство.
А минусы… Ну, как обычно. Может так получиться, что ты отписался, а тебе всё равно нотификации лезут — утечка памяти, ёбта. Или цепочка вызовов такая, что в итоге все наблюдатели друг другу мешают, и получается пиздец, а не система. Но это если криворуко делать, конечно.
Короче, паттерн полезный, но без фанатизма, а то опять соседка начнёт каждую минуту уведомления слать про своего кота.