Наблюдатель (Observer) или Издатель — подписчик (Publisher-Subscriber) – это поведенческий паттерн проектирования, который позволяет объектам следить и реагировать на изменения состояния других объектов, обеспечивая слабую связь между наблюдателями (подписчиками) и издателями (субъектами). Этот паттерн широко используется для реализации различных механизмов уведомления и событий в программных системах.
Основные участники паттерна Наблюдатель/Издатель-подписчик:
- Издатель (Publisher или Subject): Это объект, который содержит информацию и состояние, на которое подписчики могут подписаться. Издатель также содержит список подписчиков и предоставляет методы для управления этим списком, а также для уведомления подписчиков об изменениях.
- Подписчик (Subscriber или Observer): Это объект, который интересуется изменениями состояния издателя и регистрируется для получения уведомлений. Подписчики реализуют метод, который будет вызываться издателем при изменениях состояния.
- Событие (Event): Это механизм, который позволяет издателю уведомлять подписчиков о произошедших изменениях. В некоторых языках программирования, таких как Python, для реализации этого механизма могут использоваться встроенные библиотеки для работы с событиями.
Пример использования паттерна Наблюдатель на Python:
python
# Издатель (Subject) class Publisher: def __init__(self): self._subscribers = [] def add_subscriber(self, subscriber): self._subscribers.append(subscriber) def remove_subscriber(self, subscriber): self._subscribers.remove(subscriber) def notify_subscribers(self, message): for subscriber in self._subscribers: subscriber.update(message) # Подписчик (Observer) class Subscriber: def update(self, message): print(f"Подписчик получил сообщение: {message}") # Использование паттерна Наблюдатель publisher = Publisher() subscriber1 = Subscriber() subscriber2 = Subscriber() publisher.add_subscriber(subscriber1) publisher.add_subscriber(subscriber2) publisher.notify_subscribers("Важное сообщение!")
В этом примере есть издатель (Publisher
), который содержит список подписчиков (_subscribers
) и методы для управления ими. Подписчики (Subscriber
) реализуют метод update
, который будет вызываться издателем при отправке уведомлений.
Паттерн Наблюдатель позволяет реализовать гибкий механизм уведомления объектов о произошедших событиях и изменениях состояния. Он применяется в множестве сценариев, включая реализацию пользовательских интерфейсов, обработку событий в системах управления данными, уведомления и многое другое.