Różnica między wzorcem obserwatora a podejściem opartym na zdarzeniach

Zawsze uważałem, że wzór obserwatora jest prawie podobny do zwykłego podejścia opartego na zdarzeniach. Właściwie, prawie wierzyłem, że są one w rzeczywistości po prostu różne nazwy odnoszące się do tej samej rzeczy. Obaj używają podobnych pojęć, aby mieć coś jako słuchacza i nawet w implementacji, są prawie takie same, czyli mieć metodę/funkcję zwrotną do przeprowadzenia akcji. To jest przynajmniej w Javie.

W innych językach powiedzmy Actionscript/Flex, zdarzenia są bardziej przyjazny dla użytkownika i może wyglądać, że robi więcej niż tylko wzór obserwatora definiuje. Ale i tak pojęcia brzmią tak samo.

Ale czy to prawda? Czy wzór obserwatora jest taki sam jak zwykły styl programowania oparty na zdarzeniach?

Author: Aditya W, 2011-06-22

9 answers

Wzór obserwatora jest bardzo szczególnym przypadkiem. Zdarzenie może oznaczać wszystko. W większości implementacji wzorców obserwatorów Obserwator jest obiektem obserwującym obserwatora. Po zmianie obserwatora wywoływana jest metoda obserwatora. Ściśle mówiąc, nie jest to "wydarzenie". Oznacza to: różne różne działania obserwatora, zwykle prowadzą do wywołania różnych metod w obserwatorze. Semantyka" co " się zmieniło jest w metodzie. W systemach opartych na zdarzeniach zasadniczo mają jeden konsumujący obiekt / metodę i komunikat, co zostało zmienione lub co się stało, jest w zdarzeniu. To może być wszystko i nie ogranicza się do idei obserwowania czegoś! Oznacza to, że: w systemie opartym na zdarzeniach można uzyskać nową semantykę poprzez dodanie nowych typów zdarzeń. We wzorcu Observer zazwyczaj dodaje się semantykę, dodając metodę do klasy Observer. Jednak: nikt nie przeszkadza ci zaimplementować obserwatora jako specjalnego Listera do ChangeEvents.

 29
Author: Angel O'Sphere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-22 14:10:05

Gdy nastąpi zmiana stanu w Wydawcy lub temacie,

  • Architektura sterowana zdarzeniami (jest architekturą sterowaną wiadomościami), odpowiedzialna za asynchronicznie dostarczenie Wiadomości do subskrybenta.

  • Pattern Observer (jest wzorcem projektowym oprogramowania), odpowiedzialny za polecenie Abonenta do zrobienia czegoś, synchronicznie.

 15
Author: Zeigeist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-05 18:28:16

Różnica nr 1 może być taka, że Event-Systemy zawsze mają eventdispatchthread, który oddziela obserwable od swoich obserwatorów, więc zdarzenia mogą nie dotrzeć do obserwatorów natychmiast. Podczas gdy rzeczywiste obiekty obserwacyjne wywołują metody obserwatorów bezpośrednio, obiekty obserwacyjne sterowane zdarzeniami upuszczają swoje zdarzenia do zapytania zdarzeń. Następnie EDT dostarcza te wydarzenia zarejestrowanym słuchaczom.

 8
Author: Spacerat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-15 05:14:58

Programowanie sterowane zdarzeniami jest terminem określającym paradygmat. a także mając na uwadze obserwowalny wzorzec jest rozwiązaniem projektowym pozwalającym na wykonanie aplikacji sterowane zdarzeniami.

Zdrówko!
 4
Author: dheeran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-08 07:07:06

Szukałam trochę tego samego pytania. W tym wątku znajduję punkt z Angel O ' Sphere na "What semantics" i punkt z Spacerat na "Dispatcher" pomaga.

Te dwa punkty są moim zdaniem, które odróżniają parzystego kierowcę od obserwatora. Przynajmniej z kanonicznego wyjaśnienia, "Obserwator Pattern" Zwykle reprezentuje natychmiastowe nadawanie po zmianie "tematu " i" wysyłanie " jest realizowane przez wywołanie interfejsu dostarczonego przez Abonenta lub słuchacz. Podczas gdy dla zdarzeń sterowanych, zawsze jest inna warstwa między "podmiotem i "obserwatorem". Nazywany "dyspozytorem" lub "kolejką zdarzeń". Zapewnia to obsługę "opóźnioną" w celu zmniejszenia użycia procesora, a także zapewnia pewną możliwość wywoływania różnych interfejsów w zależności od rodzaju zdarzenia.

 1
Author: user2189731,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-12 05:31:25

Podstawową różnicą w obu jest sprzężenie i zachowanie synchroniczne. Jeśli trzymamy się wzorca obserwatora, mówimy, że istnieje tylko jedno źródło sygnału i byłoby ono synchroniczne, podczas gdy z drugiej strony z wydarzeniami, oddzielamy obie strony do pracy niezależnie i jednocześnie zapewniamy możliwość posiadania więcej niż jednego źródła zdarzeń w przyszłości bez żadnych zmian kodu. Wydarzenia pomagają nam objąć asynchronizację jako projektowanie. Wszystkie Reactive programming library zapewniają bardzo dobre wsparcie dla zdarzenia driven design.

 1
Author: Rahul Garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-12 19:05:42

Staram się to bardzo proste, bo to też mi kiedyś pomogło.

Po prostu myśl jako obserwator i obserwowalny. Zamiast tego obserwowalny oznacza setChanged I Obserwator żąda od obserwowalnego tego, co się zmieniło, obserwowalny zamiast tego przekazuje obserwatorom obiekt (Stan przenoszony przez zdarzenie) ze wszystkimi istotnymi informacjami o zmianie. Jest więc jeszcze jeden przypadek pomiędzy obserwatorem a Obserwowalne.

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

 1
Author: AnnaKlein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-16 09:36:13

Tak, są głównie takie same.

Zdarzenia są czymś w rodzaju "wbudowanego" szablonu obserwatora dla niektórych języków.

Tak więc, tak naprawdę nie zaimplementowałbyś wzorca observer w języku, który obsługuje zdarzenia, ponieważ dostarczają one już to, czego szukasz.
Z drugiej strony, możesz pisać zdarzenia w językach, w których nie ma zdarzeń, używając wzorca observer.

 0
Author: Matthias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-22 12:10:50

From Wikipedia :

Wzorzec obserwatora jest wzorcem projektowym oprogramowania, w którym obiekt, nazywa podmiotem, utrzymuje listę jego zależnych, nazywa obserwatorów i automatycznie powiadamia ich o wszelkich zmianach stanu, zazwyczaj przez wywołanie jednej z ich metod.

Stosowany jest głównie do implementacji rozproszonych systemów obsługi zdarzeń, w oprogramowanie "sterowane zdarzeniami". Większość nowoczesnych języków, takich jak Java i C# zbudowali w" eventowych " konstrukcjach, które wdrożenie wzorca obserwatora komponenty, do łatwego programowania i krótkiego kodu.

Obserwator wzór jest nieco bardziej abstrakcyjny i teoretyczny. Zdarzenia są jedną (powszechnie wbudowaną) implementacją , jednak jak zauważono w Answer ' s answer, zdarzenia mogą być używane w kilku innych sytuacjach, poza tym, co jest ściśle określone we wzorze obserwatora.

 0
Author: iliketocode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-13 03:18:06