Назад к вопросам
Middle
73
questionbank
Что такое паттерн Наблюдатель (Observer)?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Паттерн Наблюдатель (Observer) — это поведенческий паттерн проектирования, который определяет взаимодействие "один ко многим" между объектами. В нем субъект (издатель) уведомляет своих наблюдателей (подписчиков) об изменениях своего состояния.
Суть:
- Субъект (Subject/Publisher): Содержит состояние, которое интересует наблюдателей. Имеет методы для добавления/удаления наблюдателей и уведомления их.
- Наблюдатель (Observer/Subscriber): Определяет интерфейс для получения уведомлений от субъекта. Каждый наблюдатель реализует этот интерфейс.
Как работает:
- Наблюдатели "подписываются" на события или изменения состояния субъекта.
- При изменении состояния субъекта, он проходит по списку своих наблюдателей и вызывает их метод уведомления.
- Наблюдатели реагируют на уведомление, обычно получая обновленное состояние от субъекта.
Преимущества:
- Слабая связанность: Субъект не знает конкретных наблюдателей, взаимодействуя только через общий интерфейс.
- Гибкость: Легко добавлять, удалять или изменять наблюдателей без изменения кода субъекта.
- Поддержка принципа "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")