LINUX.ORG.RU

Паттерн наблюдатель - Менеджер изменений

 


0

1

Добрый день.
В книге Приемы объектно-ориентированного проектирования. Паттерны проектирования от Банды четырех в главе о Наблюдателе обсуждается так называемый менеджер изменений (ChangeManager), применяемый для инкапсуляции сложной семантики обновления. А также реализация основанная на ациклическом направленном графе зависимостей между субъектами и их наблюдателями (DAGChangeManager).
0) В начале описания менеджера изменений пишется, что если некоторая операция влечет за собой изменения в нескольких независимых субъектах, то нужно, чтобы наблюдатели уведомлялись после того, как будут модифицированы ВСЕ субъекты, дабы не уведомлять одного и того же наблюдателя несколько раз. Почему именно так? Ведь если субъекты независимы, то логично при изменениях в некотором субъекте СРАЗУ уведомить соответствующих наблюдателей. И почему тут говорится НЕ УВЕДОМЛЯТЬ НЕСКОЛЬКО РАЗ ? Ведь за один вызов уведомляющей функции наблюдателю передается информация об изменении одного субъекта, соответственно, для того, чтобы уведомить его об изменениях в нескольких субъектах, нужно вызвать уведомляющую функцию, соответствующую каждому субъекту. Соответственно в любом случае будет столько вызовов уведомляющей функции, сколько субъектов изменилось для каждого наблюдателя.
1) В описании говорится, что если у одного наблюдателя несколько субъектов, то плохо, когда изменения сразу у нескольких субъектов, ведь тогда наблюдатель получит избыток уведомлений. Но почему избыток? Ведь логично, что от каждого субъекта будет по одному уведомлению для каждого субъекта? И далее пишется, что DAGChangeManager гарантирует, что наблюдатель получит только одно уведомление. Опять-таки какого хрена? Ведь нужно, чтобы наблюдатель получил уведомление от каждого субъекта, у которого зарегистрирован.
2) Можете более подробно описать работу DAGChangeManager?

★★★★★

0) скорее всего связано с тем что бы получить гарантировано консистентные данные после выполнения какой то атомарной операции над всеми субъектами

1) см. пункт 0

anonymous ()
Ответ на: комментарий от anonymous

0) скорее всего связано с тем что бы получить гарантировано консистентные данные после выполнения какой то атомарной операции над всеми субъектами

Про это также есть ранее в этой главе. Но там просто рекомендуется все изменяющие субъект функции дергать из ШАБЛОННЫХ МЕТОДОВ, а после вызова этой функции уже вызывать уведомляющую функцию.

rumgot ★★★★★ ()

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

PatrickKilpatrick ()