Skip to content

Latest commit

 

History

History

observer

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

Паттерн "Наблюдатель"

Определение

Определяет отношение "один-ко-многим" между объектами таким образом, что при изменении состояния одного объекта происходит автоматическое оповещение и обновление всех зависимым объектов.

Используемые принципы

  1. Инкапсулируйте то, что изменяется
  2. Отдавайте предпочтение композиции перед наследованием
  3. Программируйте на уровне интерфейсов, а не реализаций
  4. Стремитесь к слабой связанности взаимодействующих объектов.

Описание примера

В примере показана реализация данного паттерна в приложении для метеостанции.

Необходимо реализовать такое приложение, которое будет отображать информацию на трех визуальных элементах. К тому же необходимо добавить возможность реализовывать визуальные элементы сторонними разработчиками. Так как в приложении используется три визуальных элемента, к тому же, еще планируется добавлять новые, нельзя напрямую обновлять информацию в этих элементах, так как придется вносить правки в основной код приложения при каждом добавлении нового визуального элемента. Поддержка данного приложения становится очень ресурсозатратной.

В данной ситуации и применяется паттерн "Наблюдатель".

  1. Создаются интерфейсы наблюдателя и субъекта, располагающего данными;
  2. Реализуются методы регистрации и удаления наблюдателей у субъекта;
  3. Реализуется оповещение зарегистрированных наблюдателей у субъекта;
  4. Реализуется активная доставка информации прямо в оповещении или же get-методы для запроса необходимой информации у субъекта (считается, что лучше использовать запросы, так как различным наблюдателям нужны различные наборы информации субъекта);
  5. Реализуется обновление информации у наблюдателя.

Для получения информации объект регистрируется у субъекта в качестве наблюдателя. Для прекращения получения информации объект удаляется из списка наблюдателей у субъекта.

Ключевые моменты

  1. Паттерн "Наблюдатель" определяет отношение "один-ко-многим" между объектами
  2. Субъекты обновляют наблюдателей через единый интерфейс
  3. Субъект ничего не знает о наблюдателях - кроме того, что они реализуют интерфейс Observer
  4. При использовании паттерна возможен как запрос, так и активная доставка данных от субъекта (запрос считается более правильным)
  5. Работа кода не должна зависеть от порядка оповещения наблюдателей