Определяет отношение "один-ко-многим" между объектами таким образом, что при изменении состояния одного объекта происходит автоматическое оповещение и обновление всех зависимым объектов.
- Инкапсулируйте то, что изменяется
- Отдавайте предпочтение композиции перед наследованием
- Программируйте на уровне интерфейсов, а не реализаций
- Стремитесь к слабой связанности взаимодействующих объектов.
В примере показана реализация данного паттерна в приложении для метеостанции.
Необходимо реализовать такое приложение, которое будет отображать информацию на трех визуальных элементах. К тому же необходимо добавить возможность реализовывать визуальные элементы сторонними разработчиками. Так как в приложении используется три визуальных элемента, к тому же, еще планируется добавлять новые, нельзя напрямую обновлять информацию в этих элементах, так как придется вносить правки в основной код приложения при каждом добавлении нового визуального элемента. Поддержка данного приложения становится очень ресурсозатратной.
В данной ситуации и применяется паттерн "Наблюдатель".
- Создаются интерфейсы наблюдателя и субъекта, располагающего данными;
- Реализуются методы регистрации и удаления наблюдателей у субъекта;
- Реализуется оповещение зарегистрированных наблюдателей у субъекта;
- Реализуется активная доставка информации прямо в оповещении или же get-методы для запроса необходимой информации у субъекта (считается, что лучше использовать запросы, так как различным наблюдателям нужны различные наборы информации субъекта);
- Реализуется обновление информации у наблюдателя.
Для получения информации объект регистрируется у субъекта в качестве наблюдателя. Для прекращения получения информации объект удаляется из списка наблюдателей у субъекта.
- Паттерн "Наблюдатель" определяет отношение "один-ко-многим" между объектами
- Субъекты обновляют наблюдателей через единый интерфейс
- Субъект ничего не знает о наблюдателях - кроме того, что они реализуют интерфейс Observer
- При использовании паттерна возможен как запрос, так и активная доставка данных от субъекта (запрос считается более правильным)
- Работа кода не должна зависеть от порядка оповещения наблюдателей