Обязательства наблюдателя: зачем наблюдателю менять тему? - PullRequest
4 голосов
/ 03 апреля 2012

Читая статьи о структуре наблюдателя, я наткнулся на точку ниже, приведенную в разделе «Обязательства модели наблюдателя»

Объекты-наблюдатели полностью независимы и не знают о существовании собратьев-наблюдателей. Следовательно, объект-наблюдатель может изменить состояние субъекта (в методе обновления) до того, как даже все наблюдатели будут уведомлены. Это может привести к несогласованности состояний и уведомления об изменении состояния будут потеряны.

  1. Почему наблюдатель сменил тему? Разве наблюдатели не должны быть уведомлены об изменении предмета, а не об изменении предмета самостоятельно?

В случае, если это возможно

  1. Пожалуйста, дайте мне знать через пример
  2. Также укажите, почему субъект не может ограничить себя в разрешении любому наблюдателю изменять его до того, как все наблюдатели уведомят о более раннем изменении?

Ответы [ 3 ]

3 голосов
/ 03 апреля 2012

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

class MyObserver implements Observer<MySubject> {
  ...
  public void notify(MySubject theSubject) {
    ...
    theSubject.changeSomeProperty(newValue);
  }
  ...
}

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

  • проходят только интерфейс только для чтения Subject to Observers - этосамый простой в реализации, без побочных эффектов, однако злой Наблюдатель может все еще попытаться понизить Субъекта, чтобы получить доступ к его методам модификатора, и / или получить доступ к полному Субъекту через какой-либо другой объект (ы)Субъект является доступным только для чтения Адаптером к реальному Субъекту и публикует только первый - это предотвращает трюк с понижением и может затруднить (но не делает невозможным) доступ наблюдателей к реальному Субъекту через какой-либо другой объект (ы)
  • "заблокировать" тему на время обновления по setting Например, флаг, который проверяется в каждом методе модификатора (и затем, например, выдает исключение, если флаг включен) - это не позволяет не только Наблюдателям, но и всем изменять Предмет в течение критического времени, что может или не может быть желательным
1 голос
/ 03 апреля 2012

Если наш субъект S и у нас зарегистрировано два наблюдателя;A и B, затем:

Если A s responseHandler() содержит код, который изменит S, то он изменит состояние S до того, как B получит уведомление,

Код для обработки определенного заказа или других особых условий будет принадлежать S методу notifyObservers(), где вы можете пометить S как неизменяемый или, возможно, подготовить какой-то конкретный порядок уведомления для обновления S.

1 голос
/ 03 апреля 2012

Хотя это и не рекомендуется, ничто не мешает наблюдателям изменять состояние наблюдаемого объекта (обычно см. Const -корректность в C ++ для контрпримеров). Конечно, наблюдаемый объект может прыгать через обручи, чтобы предотвратить / запретить это, но это утомительно.

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

...