Должен ли я использовать Observer или Events, когда только один объект нуждается в уведомлении? - PullRequest
0 голосов
/ 03 июля 2010

Теперь, когда я научился использовать Observers, два вопроса привлекли мое внимание:

1 - Распространено ли использование Observer Pattern для уведомления только одного объекта об изменениях?
2 - Когда нужен только один объектчтобы быть в курсе, лучше использовать наблюдателя или событие?Или есть случаи, когда требуется только одно уведомление о том, что Наблюдатели более рекомендуются?

1 Ответ

2 голосов
/ 03 июля 2010

Я не вижу Observer и Events в качестве альтернативы, это не или . Когда мы устанавливаем отношение подписки / события между Event Producer и Event Consumer, мы используем шаблон Observer - см. статью в Википедии об Observer .

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

 Define Event
 Write Subscribe Method
 Keep track of subscriptions
 Write Unsubscribe Methos
 Write Event Notification

мы просто

 Write a dinnerIsReady(payload) method on consumer
 Arrange for producer to know about consumer (perhaps because producer creates consumer)
 consumer.dinnerIsReady(payload)

Что немного меньше работы. [Возможно, это не намного меньше работы в тех средах, в которых есть хорошие фреймворки событий.]

Шаблон наблюдателя очень важен, если у вас есть несколько потребителей. Если изначально у вас есть только один потребитель, то, возможно, будет излишне стремиться к полной модели подписки / публикации. Если вместо этого вы просто используете модель Payload / ConsumerInterface, вы получаете разъединение Producer и Consumer с меньшим количеством работы.

 Consumer implements IDinnerIsReady

 Publisher.registerConsumer(IDinnerIsReady c)
 {
      assert(no existing consumer);
      myConsumer = c;
 }

 ...
     c.dinnerIsready();
 ...

Я бы счел это вполне разумным.

...