Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns via C#.pdf
Скачиваний:
153
Добавлен:
17.03.2016
Размер:
13.25 Mб
Скачать

232

Участники

Subject - Субъект (издатель):

Издатель содержит ссылки на своих подписчиков и предоставляет интерфейс (набор методов) для добавления и удаления подписчиков. На издателя может ссылаться любое число подписчиков.

Observer - Наблюдатель (подписчик):

Подписчик предоставляет интерфейс (набор методов) для обновления своего состояния при изменении состояния издателя.

ConcreteSubject - Конкретный субъект (конкретный издатель):

Конкретный издатель посылает уведомление своим подписчикам и передает им свое состояние.

ConcreteObserver - Конкретный наблюдатель (конкретный подписчик):

Реализует интерфейс обновления, предоставляемый абстрактным классом Observer и поддерживает согласованность состояния с издателем.

Отношения между участниками

Отношения между классами

Абстрактный класс Subject связан связью отношения ассоциации с абстрактным классом

Observer.

Конкретный класс ConcreteSubject связан связью отношения наследования с абстрактным классом Subject.

Конкретный класс ConcreteObserver связан связью отношения наследования с абстрактным классом Observer и связью отношения ассоциации с конкретным классом ConcreteSubject.

Отношения между объектами

ConcreteSubject (издатель) уведомляет своих наблюдателей (подписчиков) о любом изменении, которое могло бы привести к рассогласованности состояний издателя и подписчика.

ConcreteObserver (подписчик) после получения от ConcreteSubject (издателя) уведомления об изменении состояния, может запросить у издателя дополнительную информацию для полного согласования своего состояния.

Метод Notify класса ConcreteSubject (издателя) может быть вызван не только издателем самостоятельно, также этот метод могут вызывать и подписчики, и посторонние клиенты.

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

233

См. Пример к главе: \019_Observer\005_Observer

Попытка избавиться от дублирования обновления состояния подписчика-инициатора приведет к потере унификации работы с подписчиками, придётся организовывать логику по выявлению (определению) подписчика-инициатора изменения состояния, чтобы потом его определенным образом на время посылки уведомлений исключить из списка уведомляемых подписчиков, что добавит сложности в подсистему.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]