Разница между шаблоном наблюдателя и подходом, управляемым событиями - PullRequest
55 голосов
/ 22 июня 2011

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

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

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

Ответы [ 10 ]

34 голосов
/ 22 июня 2011

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

23 голосов
/ 12 июня 2016

При изменении состояния на издателе или в теме

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

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

11 голосов
/ 08 апреля 2018

Программирование на основе событий - это термин для определения парадигмы. в то время как Наблюдаемый шаблон - это дизайнерское решение для подачи заявки событийный.

ура!

10 голосов
/ 15 марта 2013

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

1 голос
/ 18 октября 2018

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

В паттерне Observer Observ ed поддерживает ссылки на свою Observ ers .

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

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

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

1 голос
/ 15 апреля 2018

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

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

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

1 голос
/ 12 мая 2017

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

1 голос
/ 12 августа 2016

Я немного искал этот же вопрос. В этой теме я нахожу точку зрения Ангела О'Сферы о том, «Что такое семантика», и точку зрения Космоса о «Диспетчере».

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

0 голосов
/ 13 мая 2017

Из Википедия :

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

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

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

0 голосов
/ 22 июня 2011

Да, они в основном одинаковы.

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

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

...