Как лучше реализовать такую архитектуру, когда есть объекты, которые зависят от общего обновления? Для решения этой задачи подходит паттерн наблюдатель.
Что из себя представляет?
Наблюдатель — поведенческий шаблон проектирования. Также известен как «подчинённые» (Dependents). Реализует у класса механизм, который позволяет объекту этого класса получать оповещения об изменении состояния других объектов и тем самым наблюдать за ними.
Шаблон «наблюдатель» применяется в тех случаях, когда система обладает следующими свойствами:
- существует как минимум один объект, рассылающий сообщения;
- имеется не менее одного получателя сообщений, причём их количество и состав могут изменяться во время работы приложения;
Данный шаблон часто применяют в ситуациях, в которых отправителя сообщений не интересует, что делают получатели с предоставленной им информацией.
Пример
Необходимо создать систему оповещения новостей по почте, после выхода новости на сайте. Реализация паттерна будет отличаться от схемы, т.к. можно реализовать паттерн наблюдатель без использования событий.
В первую очередь необходимо реализовать сам объект отклика. Для этого напишем интерфейс и реализуем класс от него. В нём необходимо реализовать систему отклика. Другими словами, что будет происходить при создании новости на сайте. За это отвечает метод Update.
Далее необходимо реализовать главный объект инициации вызова, в нашем случае это сайт.
Так будет выглядеть интерфейс системы оповещения. Внутри него написаны определения добавления/удаления/оповещения объектов.
Далее используем созданный механизм.
Результат:
В итоге получаем гибкую систему, в которой может быть множество реализаций IObserver. В ней легко передавать данные объектам IObserver.
Полный код: pastebin.
Телеграмм канал: https://t.me/dotnetreview