Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Реализация

Читайте также:
  1. IV.Реализация продукции
  2. RAIDS Практическая реализация
  3. Вымирание - как реализация идеала
  4. Глава 9. РЕАЛИЗАЦИЯ ИМУЩЕСТВА ДОЛЖНИКА НА ТОРГАХ
  5. Злоупотребление правом, реализация интереса и правореализация: проблемы соотношения.
  6. Интерфейс и реализация
  7. Конкретная ситуация 3 Реализация стратегических изменений
  8. Наиболее эффективная реализация божественной сути человека происходит в отношениях с людьми, в построении уважительных, любящих, дружеских отношений со всеми окружающими.
  9. Правомерное поведение, реализация права.
  10. Разработка и реализация маркетинговых проектов и программ

В этом разделе обсуждаются вопросы, относящиеся к реализации механизма зависимостей:

а отображение субъектов на наблюдателей. С помощью этого простейшего способа субъект может отследить всех наблюдателей, которым он должен по­сылать уведомления, то есть хранить на них явные ссылки. Однако при на­личии большого числа субъектов и всего нескольких наблюдателей это мо­жет оказаться накладно. Один из возможных компромиссов в пользу экономии памяти за счет времени состоит в том, чтобы использовать ассоци­ативный массив (например, хэш-таблицу) для хранения отображения меж­ду субъектами и наблюдателями. Тогда субъект, у которого нет наблюдате­лей, не будет зря расходовать память. С другой стороны, при таком подходе увеличивается время поиска наблюдателей;

а наблюдение более чем за одним субъектом. Иногда наблюдатель может зави­сеть более чем от одного субъекта. Например, у электронной таблицы быва­ет более одного источника данных. В таких случаях необходимо расширить интерфейс Update, чтобы наблюдатель мог «узнать», какой субъект прислал уведомление. Субъект может просто передать себя в качестве параметра операции Update, тем самым сообщая наблюдателю, что именно нужно об­следовать;

а кто инициирует обновление. Чтобы сохранить согласованность, субъект и его наблюдатели полагаются на механизм уведомлений. Но какой именно объект вызывает операцию-Notify для инициирования обновления? Есть два варианта:


 

Паттерн Observer

- операции класса Sub j ect, изменившие состояние, вызывают Noti f у для
уведомления об этом изменении. Преимущество такого подхода в том, что
клиентам не надо помнить о необходимости вызывать операцию Notify
субъекта. Недостаток же заключается в следующем: при выполнении каж­
дой из нескольких последовательных операций будут производиться обнов­
ления, что может стать причиной неэффективной работы программы;

- ответственность за своевременный вызов Notify возлагается на клиен­
та. Преимущество: клиент может отложить инициирование обновления
до завершения серии изменений, исключив тем самым ненужные проме­
жуточные обновления. Недостаток: у клиентов появляется дополнитель­
ная обязанность. Это увеличивает вероятность ошибок, поскольку кли­
ент может забыть вызвать Notify;

а висячие ссылки на удаленные субъекты. Удаление субъекта не должно при­водить к появлению висячих ссылок у наблюдателей. Избежать этого мож­но, например, поручив субъекту уведомлять все свои наблюдатели о своем удалении, чтобы они могли уничтожить хранимые у себя ссылки. В общем случае простое удаление наблюдателей не годится, так как на них могут ссылаться другие объекты и под их наблюдением могут находиться другие субъекты;

а гарантии непротиворечивости состояния субъекта перед отправкой уведом­ления. Важно быть уверенным, что перед вызовом операции Notify состо­яние субъекта непротиворечиво, поскольку в процессе обновления соб­ственного состояния наблюдатели будут опрашивать состояние субъекта. Правило непротиворечивости очень легко нарушить, если операции одного из подклассов класса Subject вызывают унаследованные операции. На­пример, в следующем фрагменте уведомление отправляется, когда состоя­ние субъекта противоречиво:

void MySubject::0peration (int newValue) { В aseClass Subject::Operation(newValue); // отправить уведомление

_my!nstVar += newValue;

// обновить состояние подкласса (слишком поздно!) }

Избежать этой ловушки можно, отправляя уведомления из шаблонных ме­тодов (см. описание паттерна шаблонный метод) абстрактного класса Subject. Определите примитивную операцию, замещаемую в подклассах, и обратитесь к Notify, используя последнюю операцию в шаблонном мето­де. В таком случае существует гарантия, что состояние объекта непротиво­речиво, если операции Subject замещены в подклассах:

void Text::Cut (TextRange r) {

ReplaceRange(г); // переопределена в подклассах Notify ();




Дата добавления: 2015-09-11; просмотров: 75 | Поможем написать вашу работу | Нарушение авторских прав

Паттерн Iterator | Паттерны поведения | Паттерны поведения | Паттерны поведения | Virtual -FontDialogDirector(); | Паттерн Memento | Участники | Паттерны поведения | Пример кода | Паттерн Memento |


lektsii.net - Лекции.Нет - 2014-2025 год. (0.005 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав