Нигде не указано, что Наблюдатель не может сам изменить свой Субъект, хотя это не рекомендуется в большинстве случаев по вышеуказанным причинам.Тем не менее, технически это возможно, особенно если вызов уведомления включает сам субъект в качестве параметра:
class MyObserver implements Observer<MySubject> {
...
public void notify(MySubject theSubject) {
...
theSubject.changeSomeProperty(newValue);
}
...
}
Что касается того, как запретить наблюдателям изменять субъект во время цикла уведомления, я вижу некоторыеопций, но каждый из них вносит дополнительную сложность, ни одна из них не является гарантией 100%, а некоторые из них более хлопотны, чем стоит.
- проходят только интерфейс только для чтения Subject to Observers - этосамый простой в реализации, без побочных эффектов, однако злой Наблюдатель может все еще попытаться понизить Субъекта, чтобы получить доступ к его методам модификатора, и / или получить доступ к полному Субъекту через какой-либо другой объект (ы)Субъект является доступным только для чтения Адаптером к реальному Субъекту и публикует только первый - это предотвращает трюк с понижением и может затруднить (но не делает невозможным) доступ наблюдателей к реальному Субъекту через какой-либо другой объект (ы)
- "заблокировать" тему на время обновления по setting Например, флаг, который проверяется в каждом методе модификатора (и затем, например, выдает исключение, если флаг включен) - это не позволяет не только Наблюдателям, но и всем изменять Предмет в течение критического времени, что может или не может быть желательным