Различие между шаблоном наблюдателя и ориентированным на события подходом

Я всегда находил шаблон Observer, почти похожий на обычный подход, основанный на событиях. На самом деле, я почти верил, что они на самом деле просто разные имена, относящиеся к одному и тому же. Они используют одинаковые концепции, чтобы иметь что-то в качестве слушателя и даже в реализации, они почти то же самое, что для выполнения действия метод/функция обратного вызова. Это по крайней мере на Java.

В других языках говорят ActionScript/Flex, события более удобны для пользователя и могут выглядеть так, как будто это больше, чем определяет шаблон наблюдателя. Но все же, понятия звучат одинаково.

Но действительно ли это так? Является ли шаблон Observer тем же, что и обычный стиль программирования, управляемый событиями?

Ответ 1

Шаблон наблюдения - это особый экземпляр. Event-Driven может означать что угодно. В большинстве реализаций Pattern Observer наблюдатель является объектом наблюдения наблюдателя. Когда наблюдаемое изменяется, вызывается метод наблюдателя. Строго говоря, это не "событие". Это означает: различные действия над наблюдателем, обычно приводят к вызову разных методов в наблюдателе. В методе семантика "что" была изменена. В системах, управляемых событиями, в основном у вас есть один объект/метод потребления, а также сообщение о том, что было изменено или что произошло в событии. Это может быть что угодно и не ограничивается идеей наблюдения чего-то! Это означает: в Event Driven System вы получаете новую семантику, добавляя новые типы событий. В шаблоне Observer вы обычно добавляете семантику, добавляя метод к классу Observer. ОДНАКО: никто не мешает вам использовать Observer в качестве специального фонаря для ChangeEvents.

Ответ 2

Когда в издателе или Subject изменяется состояние,

  • Архитектура, управляемая событиями (это управляемая сообщениями архитектура), ответственная за доставку сообщения Абоненту асинхронно.

  • Шаблон наблюдателя (шаблон проектирования программного обеспечения), ответственный за команду Абонент, чтобы что-то делать синхронно.

Ответ 3

Различие № 1 может заключаться в том, что Event-Systems всегда имеют событие eventdispatchthread, который отделяет наблюдаемые от его наблюдателей, поэтому события могут не доходить до наблюдателей немедленно. В то время как реальные наблюдаемые вызовы непосредственно используют методы наблюдателя, наблюдаемые события, связанные с событиями, переносят свои события в eventqueue. Затем EDT передает эти события зарегистрированным слушателям.

Ответ 4

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

Ура!

Ответ 5

Я искал немного для этого же вопроса. Для этой темы я нахожу точку зрения от Angel O'Sphere на тему "Что такое семантика" и точка из Spacerat на "Диспетчер".

Это два момента, которые я понимаю, чтобы отличить Even-Driver от Pattern Observer. По крайней мере, из канонического объяснения "Шаблон наблюдателя" обычно представляет собой непосредственное вещание после изменения "Субъекта" и "Диспетчер" реализуется путем вызова интерфейса, предоставляемого абонентом или слушателем. Хотя для Event-Driven всегда существует другой слой между "Subject" и "Observer". Либо называется "Dispatcher", либо "Queue". Это обеспечивает "задержанную" обработку для уменьшения использования ЦП, а также предоставляет определенные возможности для вызова разных интерфейсы зависят от типа события.

Ответ 6

Основное различие в обоих случаях заключается в сочетании и синхронном поведении. Если мы придерживаемся шаблона наблюдателя, мы говорим, что есть только один источник сигнала, и он будет синхронным, в то время как, с другой стороны, с событиями, мы отключаем обе стороны работать независимо и в то же время развлекаем возможность иметь более одного источника события в будущем без каких-либо изменений кода. События помогают нам использовать async как дизайн. Вся библиотека реактивного программирования обеспечивает очень хорошую поддержку для управляемого событиями событий.

Ответ 7

Я пытаюсь сделать это очень просто, потому что это мне тоже когда-то помогло.

Просто подумайте, как наблюдатель и наблюдаемый. Вместо того, чтобы наблюдаемая помечала setChanged, а наблюдатель запрашивал у наблюдаемой то, что изменилось, вместо этого наблюдаемая передает объект (состояние переноса события) со всей соответствующей информацией об изменении наблюдателям. Таким образом, между Наблюдателем и Наблюдаемой есть еще один случай.

http://www.grahambrooks.com/event-driven-architecture/patterns/stateful-event-pattern/

Ответ 8

Синтезируя из нескольких ответов на этот вопрос, этой статьи о хакерстве и моего собственного опыта, ключевое различие между паттерном Observer и управляемой событиями (скажем, Pub-Sub) архитектурой, на мой взгляд, таково:

В шаблоне Observer, то Observ редактор поддерживает ссылки на его Observ ERS.

Принимая во внимание, что в Pub-Sub, вещатель понятия не имеет, кто его слушатели. (Или даже если кто-то там для прослушивания.) Слушатель может ожидать некоторые данные от вещателя, но не знает точно, откуда происходит событие. Может быть, это происходит из нескольких классов или удаленных систем. Возможно, нет. Это не имеет значения ни для вещателя, ни для слушателя.

Теперь, чтобы не сказать, что эти вещи очень разные. Кроме того, есть реализации, которые ведут себя как один или оба.

Например, wisper rubygem позволяет вам действовать как шаблон Observer или шаблон Pub-Sub в зависимости от ваших потребностей. Вы даже можете использовать оба вместе, если хотите.

Ответ 9

Да, они в основном такие же.

События - это нечто вроде "встроенного" шаблона шаблона наблюдателя для некоторых языков.

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

Ответ 10

От Wikipedia:

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

В основном он используется для реализации распределенных систем обработки событий, в "управляемое событиями". Большинство современных языков, таких как Java и С# имеют встроенные "события", которые реализуют шаблон наблюдателя компонентов, для простого программирования и короткого кода.

Шаблон наблюдателя является немного более абстрактным и теоретическим. События - это одна (обычно встроенная) реализация, однако, как отмечено в ответе ангела, события, как правило, могут использоваться в нескольких других ситуациях, кроме строго определенного в шаблоне наблюдателя.