Найти в Дзене

Паттерн проектирования Наблюдатель (Observer) на языке C#

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

Как я уже писал ранее, существует три вида паттернов проектирования:

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

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

Давайте рассмотрим диаграмму паттерна Наблюдатель.

-2
  • Observer — определяет интерфейс наблюдателя;
  • Subject (наблюдаемый объект) — определяет методы подключения и отключения наблюдателей;
  • ConcreteObserver — реализует интерфейс наблюдателя;
  • ConcreteSubject — конкретный тип наблюдаемого объекта.

Рассмотрим основную логику работы паттерна Наблюдатель. Существует два способа взаимодействия между объектами:

  • Pull-модель – Объект1 обращается к Объекту2 для выполнения каких-либо операций или получения данных. Соответственно Объект2 выполняет работу по требованию.
  • Push-модель – Объект2 уведомляет Объект1 о некотором событии. Соответственно Объект1 обрабатывает событие необходимым образом.

Паттерн Наблюдатель реализует push-модель взаимодействия. Он позволяет уменьшить связанность между основным и зависимыми классами. Обратите внимание, что классическая реализация данного паттерна не используется в языке C#, так как он предоставляет встроенные механизмы событийного взаимодействия объектов, такие делегаты, события (event), интерфейсы IObserver и IObservable. В языках платформы .NET паттерн Наблюдатель чаще всего реализуется с помощью событий. События представляют собой умную оболочку над делегатами, которая позволяет клиентам лишь подписываться на события или отказываться от подписки, а владельцу события — еще и инициировать событие для уведомления всех подписчиков.

Продолжение, с деталями реализации на языке C# доступно по ссылке https://shwanoff.ru/observer/