Что такое Observer
1️⃣ Как кратко ответить
Observer — это поведенческий паттерн проектирования, который определяет зависимость типа "один ко многим" между объектами, так что при изменении состояния одного объекта все зависимые от него объекты уведомляются и обновляются автоматически.
2️⃣ Подробное объяснение темы
Observer (Наблюдатель) — это паттерн проектирования, который используется для создания системы, где объекты могут подписываться на события, происходящие в других объектах, и получать уведомления об этих событиях. Это позволяет объектам взаимодействовать между собой, не зная деталей реализации друг друга, что способствует слабой связанности системы.
Зачем нужен Observer
В веб-разработке часто возникает необходимость в том, чтобы один объект мог уведомлять другие объекты о произошедших изменениях. Например, в пользовательском интерфейсе изменение данных в модели должно автоматически обновлять представление, чтобы пользователь видел актуальную информацию. Observer позволяет реализовать такую функциональность.
Как работает Observer
Observer состоит из двух основных компонентов:
- Subject (Субъект): объект, за которым наблюдают. Он хранит список наблюдателей и уведомляет их об изменениях.
- Observer (Наблюдатель): объект, который подписывается на изменения в субъекте и получает уведомления.
Пример использования Observer
Рассмотрим пример на JavaScript, где у нас есть объект Subject, который уведомляет подписчиков о своих изменениях.
// Класс Subject, который хранит состояние и список наблюдателей
class Subject {
constructor() {
this.state = 0; // Начальное состояние
this.observers = []; // Список наблюдателей
}
// Метод для добавления наблюдателя
addObserver(observer) {
this.observers.push(observer);
}
// Метод для удаления наблюдателя
removeObserver(observer) {
this.observers = this.observers.filter(obs => obs !== observer);
}
// Метод для уведомления всех наблюдателей об изменении состояния
notifyObservers() {
this.observers.forEach(observer => observer.update(this.state));
}
// Метод для изменения состояния
setState(state) {
this.state = state;
this.notifyObservers(); // Уведомляем всех наблюдателей
}
}
// Класс Observer, который подписывается на изменения в Subject
class Observer {
constructor(name) {
this.name = name;
}
// Метод, который вызывается при изменении состояния Subject
update(state) {
console.log(`${this.name} notified of state change: ${state}`);
}
}
// Создаем субъект
const subject = new Subject();
// Создаем наблюдателей
const observer1 = new Observer('Observer 1');
const observer2 = new Observer('Observer 2');
// Добавляем наблюдателей в субъект
subject.addObserver(observer1);
subject.addObserver(observer2);
// Изменяем состояние субъекта
subject.setState(1); // Оба наблюдателя будут уведомлены о новом состоянии
Объяснение кода
-
Класс
Subject: хранит текущее состояние и список наблюдателей. МетодыaddObserverиremoveObserverуправляют списком наблюдателей. МетодnotifyObserversпроходит по списку наблюдателей и вызывает их методupdate, передавая текущее состояние. МетодsetStateизменяет состояние и вызываетnotifyObservers. -
Класс
Observer: представляет наблюдателя, который подписывается на изменения вSubject. Методupdateвызывается, когдаSubjectизменяет свое состояние. -
Создание объектов: создается объект
Subjectи два объектаObserver. Наблюдатели добавляются в список наблюдателейSubject. При изменении состоянияSubjectвсе наблюдатели получают уведомление через методupdate.
Observer позволяет создавать гибкие и расширяемые системы, где компоненты могут взаимодействовать без жесткой зависимости друг от друга. Это особенно полезно в сложных интерфейсах, где изменения в одном компоненте должны автоматически отражаться в других.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться