Как работает наблюдатель


Наблюдатель – это паттерн проектирования, который позволяет объектам системы автоматически оповещать своих наблюдателей о своем состоянии и изменениях внутри них. Этот паттерн является одним из базовых в объектно-ориентированном программировании и используется во многих языках программирования. В данной статье мы рассмотрим, как работает наблюдатель и приведем примеры использования.

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

Для реализации наблюдателя необходимо определить два основных интерфейса: интерфейс наблюдаемого объекта и интерфейс наблюдателя. Интерфейс наблюдаемого объекта обычно содержит методы для добавления, удаления и оповещения наблюдателей, а интерфейс наблюдателя – метод для обработки оповещения.

Пример использования наблюдателя можно найти в графическом интерфейсе пользователя. Например, рассмотрим простую программу, которая позволяет пользователям подписываться на новости. В этом случае, объектом наблюдаемого будет сервер с новостными рассылками, а наблюдателями – пользователи, которые хотят получать эти новости. Когда сервер отправляет новость, он оповещает всех подписавшихся пользователей, и те могут обновить свою информацию.

Как работает наблюдатель?

Прежде чем рассмотреть, как работает наблюдатель, основные участники этого паттерна должны быть определены:

  1. Subject (субъект): объект, состояние которого наблюдают другие объекты. Он имеет методы для добавления и удаления наблюдателей, а также методы для уведомления наблюдателей об изменении состояния.
  2. Observer (наблюдатель): объект, который хочет быть уведомленным об изменениях в состоянии субъекта. Наблюдатель обычно реализует определенный интерфейс, имеющий метод, вызываемый субъектом для обновления состояния.

Работа наблюдателя основана на использовании подписки и уведомления. Когда объект-субъект изменяет свое состояние, он уведомляет всех текущих наблюдателей о произошедшем изменении. Наблюдатели могут проявлять интерес только к определенным типам изменений состояния субъекта, поэтому субъект предоставляет методы для добавления и удаления наблюдателей.

Применение наблюдателя позволяет создать гибкое взаимодействие между объектами, где изменение состояния одного объекта автоматически приводит к обновлению других зависимых объектов. Это обеспечивает слабую связь между объектами, что делает код более гибким и удобным для поддержки и расширения.

Принцип работы и пример использования

Принцип работы наблюдателя

Наблюдатель — это паттерн проектирования, который позволяет одним объектам следить за изменениями в других объектах и реагировать на эти изменения. Он базируется на принципе отделения основного объекта от объектов, которые отслеживают его состояние.

Основными участниками паттерна наблюдателя являются:

  • Субъект (наблюдаемый объект): Он предоставляет интерфейс для добавления, удаления и оповещения наблюдателей о любых изменениях внутри себя.
  • Наблюдатель: Это объект, который следит за изменениями в субъекте и реагирует на них.

Когда субъект изменяется, он оповещает своих наблюдателей, передавая им соответствующую информацию. При этом субъект не знает о наличии и количестве наблюдателей, а наблюдатели могут быть добавлены и удалены в любое время без воздействия на субъект.

Пример использования

Допустим, у нас есть система, отслеживающая изменения в температуре. Мы можем создать объект «Термометр» в качестве субъекта и объекты «Наблюдатель» — «Окно» и «Кондиционер». Когда термометр обновляет свои показания о температуре, он оповещает окно и кондиционер. Окно открывается или закрывается в зависимости от текущей температуры, а кондиционер включается или выключается, чтобы поддерживать комфортную температуру в помещении.

class Термометр {constructor() {this.температура = 0;this.наблюдатели = [];}добавитьНаблюдатель(наблюдатель) {this.наблюдатели.push(наблюдатель);}удалитьНаблюдатель(наблюдатель) {const индекс = this.наблюдатели.indexOf(наблюдатель);if (индекс !== -1) {this.наблюдатели.splice(индекс, 1);}}обновитьТемпературу(новаяТемпература) {this.температура = новаяТемпература;this.наблюдатели.forEach(наблюдатель => наблюдатель.обновить(this.температура));}}class Окно {обновить(температура) {if (температура > 25) {console.log('Открываю окно');} else {console.log('Закрываю окно');}}}class Кондиционер {обновить(температура) {if (температура > 30) {console.log('Выключаю кондиционер');} else {console.log('Включаю кондиционер');}}}// Пример использованияconst термометр = new Термометр();const окно = new Окно();const кондиционер = new Кондиционер();термометр.добавитьНаблюдатель(окно);термометр.добавитьНаблюдатель(кондиционер);термометр.обновитьТемпературу(28); // Открываю окно, Включаю кондиционертермометр.обновитьТемпературу(32); // Закрываю окно, Выключаю кондиционер

В этом примере объект «Термометр» является субъектом, а объекты «Окно» и «Кондиционер» — наблюдателями. Когда температура обновляется, наблюдатели получают соответствующее оповещение и реагируют на него.

Основные элементы наблюдателя

Основные элементы наблюдателя:

ЭлементОписание
СубъектСубъект предоставляет интерфейс для добавления, удаления и оповещения наблюдателей. Он содержит список наблюдателей и оповещает их о любых изменениях, происходящих в субъекте. Субъект может быть реализован с использованием интерфейса или абстрактного класса.
НаблюдательНаблюдатель определяет интерфейс, который должны реализовать все конкретные наблюдатели. Он содержит методы, которые субъект будет вызывать при оповещении об изменении. Наблюдатель также может хранить ссылку на субъект, если требуется взаимодействовать с ним в процессе обработки уведомления.
Конкретный субъектКонкретный субъект реализует интерфейс или наследуется от абстрактного класса субъекта. Он содержит дополнительные методы или свойства, которые позволяют наблюдателям подписываться на определенные события или изменения внутри субъекта.
Конкретный наблюдательКонкретный наблюдатель реализует интерфейс или наследуется от абстрактного класса наблюдателя. Он содержит логику, которая должна быть выполнена в ответ на оповещение о изменении в субъекте. Конкретный наблюдатель может также хранить ссылку на субъект, если требуется взаимодействовать с ним в процессе выполнения логики.

Применение наблюдателя помогает сделать код более гибким и легким в поддержке. Он позволяет разделить отслеживание и реагирование на изменения между различными объектами, что способствует повышению модульности и читаемости кода. Кроме того, наблюдатель делает возможным добавление и удаление наблюдателей без изменения субъекта или других наблюдателей, что упрощает расширение функциональности приложения.

Добавить комментарий

Вам также может понравиться