Читайте также:
|
|
У класса ChangeManager есть три обязанности:
- строить отображение между субъектом и его наблюдателями и предо
ставлять интерфейс для поддержания отображения в актуальном состоя
нии. Это освобождает субъектов от необходимости хранить ссылки на
своих наблюдателей и наоборот;
- определять конкретную стратегию обновления;
- обновлять всех зависимых наблюдателей по запросу от субъекта.
На следующей диаграмме представлена простая реализация паттерна наблюдатель с использованием менеджера изменений ChangeManager. Имеется два специализированных менеджера. SimplechangeManager всегда обновляет всех наблюдателей каждого субъекта, a DAGChangeManager обрабатывает направленные ациклические графы зависимостей между субъектами и их наблюдателями. Когда наблюдатель должен «присматривать» за несколькими субъектами, предпочтительнее использовать DAGChangeManager. В этом случае изменение сразу двух или более субъектов может привести к избыточным обновлениям. Объект DAGChangeManager гарантирует, что наблюдатель в любом случае получит только одно уведомление. Если обновление одного и того же наблюдателя допускается несколько раз подряд, то вполне достаточно объекта SimplechangeManager.
ChangeManager - это пример паттерна посредник. В общем случае есть только один объект ChangeManager, известный всем участникам. Поэтому полезен будет также и паттерн одиночка;
а комбинирование классов Subject и Observer, В библиотеках классов, которые написаны на языках, не поддерживающих множественного наследования (например, на Smalltalk), обычно не определяются отдельные классы Subject и Observer. Их интерфейсы комбинируются в одном классе. Это позволяет определить объект, выступающий в роли одновременно субъекта
Паттерны поведения
и наблюдателя, без множественного наследования. Так, в Smalltalk интерфейсы Sub j ect и Observer определены в корневом классе Obj ect и потому доступны вообще всем классам.
Пример кода
Интерфейс наблюдателя определен в абстрактном классе Observer:
class Subject;
class Observer { public:
virtual -Observer ();
virtual void Update (Subject* theChangedSubject) = 0; protected:
Observer (),-
};
При такой реализации поддерживается несколько субъектов для одного наблюдателя. Передача субъекта параметром операции Update позволяет наблюдателю определить, какой из наблюдаемых им субъектов изменился.
Таким же образом в абстрактном классе Subject определен интерфейс субъекта:
class Subject { public:
Дата добавления: 2015-09-11; просмотров: 87 | Поможем написать вашу работу | Нарушение авторских прав |