Паттерн Наблюдатель относится к поведенческим паттернам проектирования. Он определяет отношение "один ко многим" между объектами, при котором изменение состояния одного объекта (субъекта) автоматически оповещает всех зависимых от него объектов (наблюдателей) и обновляет их.
Принцип работы:
Субъект поддерживает список своих наблюдателей. Когда состояние субъекта меняется, он проходит по списку и вызывает метод обновления у каждого наблюдателя. Каждый наблюдатель реализует определенный интерфейс, который определяет этот метод обновления. Наблюдатели могут "подписываться" на обновления субъекта и "отписываться" от них.
Целесообразность использования:
- При необходимости оповещения множества объектов об изменении состояния одного объекта. Это типично для GUI-приложений, где изменение состояния виджета (например, нажатие кнопки) должно обновить несколько других элементов интерфейса.
- Когда система состоит из множества слабосвязанных объектов, которые должны взаимодействовать, но не знать подробностей реализации друг друга. Субъект не знает конкретных классов наблюдателей, только о том, что они реализуют интерфейс наблюдателя.
- В системах, где событие, происходящее в одном месте, должно вызвать действия в нескольких других местах. Например, при обновлении данных на сервере необходимо обновить отображение этих данных у всех подключенных пользователей.
- При реализации реактивных систем или потоков данных. Наблюдатели реагируют на изменения, как на события в потоке.
Пример структуры (Java):
java
Паттерн Наблюдатель относится к поведенческим паттернам проектирования. Он определяет отношение "один ко многим" между объектами, при котором изменение состояния одного объекта (субъекта) автоматически оповещает всех зависимых от него объектов (наблюдателей) и обновляет их.
Принцип работы:
Субъект поддерживает список своих наблюдателей. Когда состояние субъекта меняется, он проходит по списку и вызывает метод обновления у каждого наблюдателя. Каждый наблюдатель реализует определенный интерфейс, который определяет этот метод обновления. Наблюдатели могут "подписываться" на обновления субъекта и "отписываться" от них.
Целесообразность использования:
- При необходимости оповещения множества объектов об изменении состояния одного объекта. Это типично для GUI-приложений, где изменение состояния виджета (например, нажатие кнопки) должно обновить несколько других элементов интерфейса.
- Когда система состоит из множества слабосвязанных объектов, которые должны взаимодействовать, но не знать подробностей реализации друг друга. Субъект не знает конкретных классов наблюдателей, только о том, что они реализуют интерфейс наблюдателя.
- В системах, где событие, происходящее в одном месте, должно вызвать действия в нескольких других местах. Например, при обновлении данных на сервере необходимо обновить отображение этих данных у всех подключенных пользователей.
- При реализации реактивных систем или потоков данных. Наблюдатели реагируют на изменения, как на события в потоке.
Пример структуры (Java):
java