Паттерн "Наблюдатель" (Observer) — это поведенческий шаблон проектирования, который позволяет объектам следить за изменениями другого объекта и реагировать на эти изменения. Он особенно полезен в ситуациях, когда один объект зависит от состояния или поведения другого объекта, но при этом хочет оставаться независимым от его внутренней реализации.
Описание
Основные компоненты:
- Субъект (Subject): Объект, который может быть наблюдаемым. Содержит список наблюдателей и предоставляет им возможность уведомлять о своих изменениях.
- Наблюдатель (Observer): Объект, который хочет следить за изменениями субъекта. Реализует интерфейс, который позволяет ему получать уведомления от субъекта.
- Интерфейс Observer: Определяет методы, которые должен реализовать наблюдатель, чтобы получать уведомления от субъекта.
Процесс работы:
- Наблюдатель регистрируется в субъекте.
- Когда состояние субъекта меняется, он уведомляет всех зарегистрированных наблюдателей.
- Наблюдатели реагируют на изменения, обновляя свое состояние или выполняя другие действия в ответ на изменения субъекта.
Применение в общем виде
Паттерн "Наблюдатель" широко используется в различных областях программирования, где требуется реализация системы оповещений или реакции на изменения состояния объектов. Например:
- Работа с GUI: Приложения, которые реагируют на изменения состояния пользовательского интерфейса, могут использовать наблюдателя для отслеживания изменений и обновления интерфейса соответственно.
- Базы данных: Системы управления базами данных могут использовать наблюдателей для отслеживания изменений в данных и автоматического обновления связанных объектов.
- Многопользовательские игры: Игры, поддерживающие многопользовательскую игровую среду, могут использовать наблюдателей для синхронизации состояний игроков и обновления игрового мира.
Пример
Примером паттерна будет выступать система наблюдения за ценой товара и события изменения на которые подписан оптовый закупщик и обычный покупатель.
Создадим интерфейс наблюдателя IObserver
Создадим интерфейс наблюдаемого объекта IObservable
Реализуем интерфейс наблюдаемого объекта в классе Product
Создадим классы наблюдателей
Посмотрим применение.