Шаблон проектирования наблюдателя - это шаблон проектирования программного обеспечения, который концептуализирует стратегии взаимодействия между объектами и их зависимыми объектами. В таком шаблоне мы создаем предметный класс, который поддерживает список зависимостей, называемых наблюдателями, которые уведомляются о любых изменениях в состоянии предмета или о том, что они слушают.

Возможно, вы хорошо знакомы с парадигмой событийно-ориентированного программирования. Основное внимание в таких парадигмах уделяется реализации систем обработки событий. Например, «JavaScript» - популярный язык программирования, управляемого событиями. Даже в Java есть компоненты, которые прослушивают события.

Возьмем, к примеру, веб-сокеты, они помогают в создании полнодуплексной связи между клиентом и серверами. Если вы пытаетесь создать приложение для чата, очевидно, что будут создаваемые пользователем события, HTTP-запросы и ответы.

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

Наблюдатель (объект user1) подписывается на субъект («который отправляет сообщения») от другого наблюдателя (объект user2). В этом случае объект user1 не контролирует то, что ему передается, только то, что он уведомляется о некотором изменении состояния.

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

Что такое шаблон проектирования наблюдателя?

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

  1. Вы заходите на этот действительно крутой сайт, где пишут статьи о межзвездных вещах.
  2. Затем вы подписываетесь на определенную тему, например, космические пришельцы. Пока вы подпишетесь на этот список рассылки, вы будете получать статьи.
  3. Если вы откажетесь от подписки на этот список рассылки, вы не будете получать от них электронные письма.
  4. Определенно будут и другие подписчики, и неподписанные.

Прочтите: Чем на самом деле занимается DevOps? »

В этом и заключается суть шаблона проектирования наблюдателя. Издатель (электронная блог-компания) и подписчик (вы) вместе образуют шаблон наблюдателя. А на жаргоне разработчиков программного обеспечения издатель является субъектом, а подписчик - наблюдателем.

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

Зачем использовать шаблон проектирования наблюдателя?

Вернемся к примеру приложения чата, который мы использовали во вводном абзаце. Вы захотите использовать веб-сокеты для создания полнодуплексной связи между клиентом и сервером, иначе никто не захочет использовать приложение чата, которому требуется обновление страницы для получения новых сообщений.

Поскольку веб-сокеты решают эту проблему, и существуют библиотеки, которые ее реализуют, ваша проблема уже решена. Однако необходимо знать, что шаблон, которому следует большинство библиотек, основан на шаблоне проектирования наблюдателя.

Эта осведомленность очень поможет при разработке системы, которая требует общего интерфейса для обновления своих зависимостей за один раз. С помощью веб-сокетов мы достигли асинхронного поведения, обновления зависимостей при изменении состояния, и это происходит автоматически. Итак, зачем использовать шаблон проектирования наблюдателя? Какие проблемы с ним можно решить?

Прочтите: « Шаблоны проектирования Factory в Java »

Давайте рассмотрим перечисленные ниже пункты о преимуществах шаблона проектирования наблюдателя, и это должно развеять ваши сомнения в том, «зачем использовать шаблон проектирования наблюдателя»?

Преимущества шаблона проектирования Observer

  1. Шаблон проектирования наблюдателя обеспечивает шаблон проектирования объекта, в котором субъекты и наблюдатели слабо связаны. Субъекту не нужно знать все о конкретном классе, который реализует наблюдатель, ему нужно просто знать о реализации.
  2. Поскольку они слабо связаны, мы можем добавить столько наблюдателей, сколько захотим, и заменить столько, сколько захотим, без необходимости изменять множество вещей.
  3. Не нужно изменять тему для добавления других типов наблюдателей. Без концепции шаблона проектирования наблюдателя или шаблонов проектирования в целом мы бы испортили реализацию объекта.
  4. Субъекты и наблюдатели могут использоваться повторно независимо друг от друга из-за слабой связи.
  5. Изменения либо субъекта, либо наблюдателя не повлияют на другого, пока они не испорчены полностью. Шаблон проектирования наблюдателя определяет зависимость «один ко многим» между объектами, так что, когда один объект меняет состояние, все его зависимые объекты уведомляются и обновляются автоматически.
  6. Мы можем добиться асинхронного поведения нашего кода с помощью такого шаблона, и в конечном итоге конечная цель - создать базу кода, которая была бы расширяемой, поддерживаемой и повторно используемой.

Почему шаблон проектирования наблюдателя попадает в категорию шаблонов проектирования поведения?

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

Пример шаблона проектирования наблюдателя в java

Общий подход к этому шаблону проектирования заключается в том, чтобы иметь в виду следующее:

  1. Тема - отслеживает всех наблюдателей и транслирует любые изменения в состоянии.
  2. Наблюдатели - они реализуют общий интерфейс, который подписывается на тему для получения обновлений.

Таким образом мы можем отделить поведение объектов друг от друга, а также от основного класса. Итак, как вы можете реализовать шаблон проектирования наблюдателя в java?

1. Начните с объявления предметного интерфейса.

Шаблон проектирования Fig - Observer в Java - предметный интерфейс

В этом интерфейсе есть 3 метода -

  1. registerObserver - как следует из названия, он регистрирует наблюдателей с субъектом.
  2. removeObserver - используется для отписки от темы.
  3. notifyObservers - используется для обновления наблюдателей при любом изменении состояния.

2. Объявите наблюдателя

Рис. Шаблон проектирования наблюдателя в Java - интерфейс наблюдателя

Метод обновления не требует пояснений, он обновляет состояние наблюдателей.

3. Реализуйте предметный интерфейс.

Рис. Шаблон проектирования наблюдателя в Java - реализация интерфейса субъекта

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

  1. Свойства класса - список используется для хранения наблюдателей, а значение представляет собой простое целое число, которое можно рассматривать как значение состояния.
  2. Методы - метод setValue просто устанавливает значение и уведомляет наблюдателей об изменении.
  3. Конструктор. Конструктор просто инициализирует объект списка массивов для отслеживания различных наблюдателей.
  4. Другие в основном являются реализацией уже описанных методов интерфейса.

4. Реализуйте интерфейс наблюдателя.

Рис. Шаблон проектирования наблюдателя в Java - реализация интерфейса наблюдателя

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

  1. Свойства класса - есть два объявления переменных value и simpleSubject.
  2. Конструктор. Здесь ключевую роль играет шаблон проектирования наблюдателя. Класс Subject передается в качестве параметра и регистрируется внутри Observer. Обратите внимание, что наблюдатели регистрируются при необходимости, субъект делает это только тогда, когда его просят сделать это.
  3. Существует дополнительный метод отображения, который выводит значение или измененное значение.

5. Объединение всего этого воедино.

Шаблон проектирования Fig- Observer в Java - тест-драйв

Видите, как все это теперь имеет смысл? Экземпляр класса Subject имеет все, что позволяет нам регистрировать наблюдателя, обновлять значение и уведомлять об изменениях.

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

Системы, управляемые событиями, могут использовать один и тот же подход к реализации своей версии «субъекта» и «наблюдателей». В Java Swing используется шаблон наблюдателя, как и во многих фреймворках графического интерфейса пользователя; если вы когда-либо использовали его, вы можете понять этот шаблон сейчас.

Где еще можно применить шаблон проектирования наблюдателя?

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

У Java есть своя собственная библиотека шаблонов проектирования наблюдателя, как и у Python. Библиотеки управления состоянием, такие как Redux, построены на его принципах. Веб-сокеты, блокчейны, распределенные базы данных или ситуации, когда данные недоступны для ЦП при запуске.

Прочтите: « Шаблон проектирования синглтона - вдумчивое погружение в структуры и создание объектов »

Распространенное заблуждение: шаблоны проектирования не удаляют зависимости полностью, иначе не будет смысла связывать один класс с другим. Дело в том, чтобы его уменьшить.

Заключение

Итак, это был шаблон проектирования наблюдателя в Java, вы можете использовать его на любом языке программирования по вашему выбору. Теперь вы можете подробно объяснить «зачем использовать шаблон проектирования наблюдателя?», Потому что, если вы усвоите основы, объяснение и реализация будут легкими. Обобщая причину, вы можете видеть, что приведенный выше код в значительной степени расширяем.

Мы можем реализовать столько субъектов и наблюдателей, сколько захотим, без необходимости искажать конкретные классы и интерфейсы. Кроме того, каждый раз, когда происходят какие-то изменения в значениях (состоянии) классов, об этом заботится субъект, и нам не нужно писать беспорядочный код для его обновления с использованием набора условий.

Прочтите: Топ 5 лучших бесплатных IDE для разработки Java в 2020 году »