Паттерн Наблюдатель (Observer) — это поведенческий паттерн проектирования, который определяет взаимодействие "один ко многим" между объектами. В нем субъект (издатель) уведомляет своих наблюдателей (подписчиков) об изменениях своего состояния.
Суть:
- Субъект (Subject/Publisher): Содержит состояние, которое интересует наблюдателей. Имеет методы для добавления/удаления наблюдателей и уведомления их.
- Наблюдатель (Observer/Subscriber): Определяет интерфейс для получения уведомлений от субъекта. Каждый наблюдатель реализует этот интерфейс.
Как работает:
- Наблюдатели "подписываются" на события или изменения состояния субъекта.
- При изменении состояния субъекта, он проходит по списку своих наблюдателей и вызывает их метод уведомления.
- Наблюдатели реагируют на уведомление, обычно получая обновленное состояние от субъекта.
Преимущества:
- Слабая связанность: Субъект не знает конкретных наблюдателей, взаимодействуя только через общий интерфейс.
- Гибкость: Легко добавлять, удалять или изменять наблюдателей без изменения кода субъекта.
- Поддержка принципа "Open/Closed Principle": Можно расширять функциональность, добавляя новых наблюдателей, не модифицируя existing code.
Недостатки:
- Возможные проблемы с порядком уведомлений: Если порядок, в котором наблюдатели получают уведомления, важен, это может потребовать дополнительной логики.
- Утечки памяти: Если наблюдатель не отписывается от субъекта, он может остаться в памяти, даже если больше не нужен.
Применение:
- GUI-приложения: Обновление нескольких элементов интерфейса при изменении данных.
- Системы событий: Распространение событий между компонентами.
- Чат-приложения: Уведомление пользователей о новых сообщениях.
- RSS-ридеры: Уведомление о новых статьях.
Пример (псевдокод):
python