Назад к вопросам
Middle
73
questionbank

Что такое паттерн Наблюдатель (Observer)?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

Суть:

  • Субъект (Subject/Publisher): Содержит состояние, которое интересует наблюдателей. Имеет методы для добавления/удаления наблюдателей и уведомления их.
  • Наблюдатель (Observer/Subscriber): Определяет интерфейс для получения уведомлений от субъекта. Каждый наблюдатель реализует этот интерфейс.

Как работает:

  1. Наблюдатели "подписываются" на события или изменения состояния субъекта.
  2. При изменении состояния субъекта, он проходит по списку своих наблюдателей и вызывает их метод уведомления.
  3. Наблюдатели реагируют на уведомление, обычно получая обновленное состояние от субъекта.

Преимущества:

  • Слабая связанность: Субъект не знает конкретных наблюдателей, взаимодействуя только через общий интерфейс.
  • Гибкость: Легко добавлять, удалять или изменять наблюдателей без изменения кода субъекта.
  • Поддержка принципа "Open/Closed Principle": Можно расширять функциональность, добавляя новых наблюдателей, не модифицируя existing code.

Недостатки:

  • Возможные проблемы с порядком уведомлений: Если порядок, в котором наблюдатели получают уведомления, важен, это может потребовать дополнительной логики.
  • Утечки памяти: Если наблюдатель не отписывается от субъекта, он может остаться в памяти, даже если больше не нужен.

Применение:

  • GUI-приложения: Обновление нескольких элементов интерфейса при изменении данных.
  • Системы событий: Распространение событий между компонентами.
  • Чат-приложения: Уведомление пользователей о новых сообщениях.
  • RSS-ридеры: Уведомление о новых статьях.

Пример (псевдокод):

# Интерфейс Наблюдателя
interface Observer:
    method update(subject_state):
        pass

# Субъект
class Subject:
    state
    observers = []

    method attach(observer):
        add observer to observers list

    method detach(observer):
        remove observer from observers list

    method notify():
        for observer in observers:
            observer.update(self.state)

    method change_state(new_state):
        self.state = new_state
        self.notify()

# Пример Наблюдателя
class ConcreteObserver(Observer):
    method update(subject_state):
        print("State changed:", subject_state)

# Использование
subject = Subject()
observer1 = ConcreteObserver()
observer2 = ConcreteObserver()

subject.attach(observer1)
subject.attach(observer2)

subject.change_state("New State 1")
subject.change_state("New State 2")

subject.detach(observer1)
subject.change_state("New State 3")