Что противоположно шаблону наблюдателя?
Как я понимаю, шаблон наблюдателя позволяет нескольким наблюдателям контролировать один объект. Есть ли образец для противоположного сценария? Есть ли образец для одного наблюдателя, который контролирует несколько предметов и отвечает, когда какой-либо из них поднимает, скажем, событие Notify?
Ответы
Ответ 1
Шаблон Observer все еще можно использовать: просто зарегистрируйте тот же объект, что и наблюдатель, для многих контролируемых объектов. Вероятно, вы захотите, чтобы событие "Уведомлять" получило какой-то идентификатор наблюдаемого объекта (указатель "this", уникальный идентификационный номер и т.д.), Чтобы объект наблюдателя мог выбрать действие, соответствующее объекту, сообщающему об этом событии.
Ответ 2
Да. Это просто другое применение шаблона наблюдателя.
Наблюдатель добавляет себя многим Субъектам.
Если вы хотите, чтобы одно и то же действие выполнялось независимо от того, какой предмет вы наблюдаете, это точно так же, как и шаблон наблюдателя, который вы используете.
Если вам требуется отдельное действие в зависимости от того, какой предмет инициировал событие, вы можете использовать параметр Action, который передается в метод Observer ActionPerformed, чтобы определить, какой предмет вызвал событие. (эти имена могут меняться в зависимости от вашего языка или библиотеки)
Ответ 3
Если субъекты, наблюдающие наблюдателя, похожи, вы можете заставить наблюдателя контролировать их всех, если нет, я думаю, что вам лучше отделить montior, тогда вы будете следовать единому правилу ответственности.
Ответ 4
Также рассмотрим соответствующий шаблон посредника.
Шаблон медиатора определяет объект, который инкапсулирует, как взаимодействует набор объектов (Wikipedia)
Дополнительная информация здесь: http://sourcemaking.com/design_patterns/mediator
Мне также очень нравится @CDC ответ на Объектно-ориентированные шаблоны проектирования посредников Vs Observer:
Шаблон наблюдателя. Определяет зависимость "один ко многим" между объектами, так что, когда один объект изменяется, все его иждивенцы автоматически уведомляются и обновляются.
Шаблон медиатора. Определите объект, который инкапсулирует взаимодействие объекта. Посредник способствует свободному соединению, не допуская прямого доступа объектов друг к другу, и позволяет вам независимо изменять их взаимодействие.
Ответ 5
если вы хотите, чтобы наблюдатель реагировал один раз, независимо от того, сколько контролируемых объектов поднимет это событие, вам придется иметь часть обработчика событий "отменить регистрацию" наблюдателя из всех других источников, когда первый источник запускает событие, или вам нужно будет решить, как часто или какие критерии времени следует использовать, чтобы решить, когда событие из другого (или того же источника снова после определенного интервала) должно заставить наблюдателя снова реагировать...