-
Notifications
You must be signed in to change notification settings - Fork 3
Observer
Pandas edited this page Jun 19, 2017
·
1 revision
Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом и автоматически обновляются.
Используйте паттерн наблюдатель в следующих ситуациях:
- Когда у абстракции есть два аспекта, один из которых зависит от другого. Инкапсуляции этих аспектов в разные объекты позволяют изменять и повторно использовать их независимо;
- Когда при модификации одного объекта требуется изменить другие и вы не знаете, сколько именно объектов нужно изменить;
- Когда один объект должен оповещать других, не делая предположений об уведомляемых объектах. Другими словами, вы не хотите, чтобы объекты были тесно связаны между собой.
- Subject - субъект: располагает информацией о своих наблюдателях. За субъектом может «следить» любое число наблюдателей; предоставляет интерфейс для присоединения и отделения наблюдателей;
- Observer - наблюдатель: определяет интерфейс обновления для объектов, которые должны быть уведомлены об изменении субъекта;
- ConcreteSubject - конкретный субъект: сохраняет состояние, представляющее интерес для конкретного наблюдателя ConcreteObserver; посылает информацию своим наблюдателям, когда происходит изменение;
- ConcreteObserver - конкретный наблюдатель: хранит ссылку на объект класса ConcreteSubject; сохраняет данные, которые должны быть согласованы с данными субъекта; реализует интерфейс обновления, определенный в классе Observer, чтобы поддерживать согласованность с субъектом.
- объект ConcreteSubject уведомляет своих наблюдателей о любом изме нении, которое могло бы привести к рассогласованности состояний наблю дателя и субъекта;
- после получения от конкретного субъекта уведомления об изменении объ ект ConcreteObserver может запросить у субъекта дополнительную информацию, которую использует для того, чтобы оказаться в состоянии, согласованном с состоянием субъекта.
- Отметим, что объект Observer, который инициирует запрос на изменение, откладывает свое обновление до получения уведомления от субъекта. Опера ция Notify не всегда вызывается субъектом. Ее может вызвать и наблюдатель, и посторонний объект.
Паттерн наблюдатель позволяет изменять субъекты и наблюдатели независимо друг от друга. Субъекты разрешается повторно использовать без участия наблюдателей, и наоборот. Это дает возможность добавлять новых наблюдателей без модификации субъекта или других наблюдателей. Рассмотрим некоторые достоинства и недостатки паттерна наблюдатель:
- Абстрактная связанность субъекта и наблюдателя. Субъект имеет информацию лишь о том, что у него есть ряд наблюдателей, каждый из которых подчиняется простому интерфейсу абстрактного класса Observer.
- Поддержка широковещательных коммуникаций. В отличие от обычного запроса для уведомления, посылаемого субъектом, не нужно задавать определенного получателя. Уведомление автоматически поступает всем подписавшимся на него объектам.
- Неожиданные обновления. Поскольку наблюдатели не располагают информацией друг о друге, им неизвестно и о том, во что обходится изменение субъекта.
