2011-06-22 15 views
43

Zawsze uważałem, że wzorzec obserwatora jest prawie podobny do typowego podejścia sterowanego zdarzeniami. Właściwie prawie uwierzyłem, że są to po prostu różne nazwy odnoszące się do tej samej rzeczy. Obaj używają podobnych pojęć, aby mieć coś jako słuchacza, a nawet w implementacji są prawie to samo, to znaczy mieć metodę/funkcję zwrotną do wykonania akcji. Tak jest przynajmniej w Javie.Różnica między wzorcem obserwatora a podejściem opartym na zdarzeniach

W innych językach oznacza Actionscript/Flex, zdarzenia są bardziej przyjazne dla użytkownika i mogą wyglądać tak, że nie tylko definiuje wzór obserwatora. Ale nadal koncepcje brzmią tak samo.

Ale czy to naprawdę prawda? Czy Wzorzec Obserwacji jest taki sam, jak zwykły styl programowania sterowany zdarzeniami?

+0

możliwy duplikat [W jaki sposób wzorzec Obserwatora różni się od modelu sterowanego zdarzeniem?] (Http://stackoverflow.com/questions/807778/how-is-the-observer-pattern-different-co-an-event -driven-model) – nawfal

Odpowiedz

28

Wzorzec obserwatora jest wyjątkową instancją. Event-Driven może oznaczać wszystko. W większości implementacji wzorców Observer obserwator jest obiektem obserwującym obserwującego. Po zmianie obserwatora wywoływana jest metoda obserwatora. Ściśle mówiąc nie jest to "wydarzenie". Oznacza to: różne różne czynności na obserwatorze, zwykle prowadzą do wywołania w obserwatorze różnych metod . Semantyka "co" zostało zmienione jest w metodzie. W systemach napędzanych zdarzeniami, w zasadzie masz jeden obiekt/metodę zużywania i komunikat, co zostało zmienione lub co się wydarzyło w Wydarzeniu. To może być wszystko i nie jest ograniczone do idei obserwowania czegoś! Oznacza to: w systemie opartym na zdarzeniach zyskujesz nową semantykę, dodając nowe typy zdarzeń. W Wzorze Obserwatora zwykle dodajesz semantykę, dodając metodę do klasy Observer. JEDNAK: nikt nie uniemożliwia ci wdrożenia Obserwatora jako specjalnej listy do ChangeEvents.

+89

Czytanie tego zdezorientowało mnie jeszcze bardziej. – crush

+0

@crush mogę dodać przykład dla większej ilości wyjaśnień, w języku Java, EDT jest magistralą zdarzeń przechwytuje wszystkie zdarzenia, które system wysłał, powiedzmy przycisk kliknij, EDT wyśle ​​zdarzenie click, przycisk go złapie - pamiętaj, że pojemnik nadrzędny przycisku może również przechwycić zdarzenie, a sam przycisk może przechwytywać inne zdarzenia - jest to przykład wzorca zdarzenia. teraz przycisk zarejestrował detektory, które zostały powiadomione i wywołane z przycisku dostarczającego to zdarzenie, ta rejestracja jest przykładem wzorca obserwatora – DrAhmedJava

+1

Tak więc zdarzenia są jak transmisje bez zamierzonego odbiornika, podczas gdy wzorzec obserwatora jest podobny do multiemisji, gdzie odbiornik jest bezpośrednio obserwować, czy sygnał jest widoczny? – Gulshan

0

Tak, są to głównie te same.

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

W ten sposób naprawdę nie zaimplementujesz wzorca obserwatora w języku, który obsługuje zdarzenia, ponieważ zapewniają one już to, czego szukasz.
Z drugiej strony można napisać zdarzenie sterowane zdarzeniami w językach, w których brakuje zdarzeń za pomocą wzorca obserwatora.

+0

Powiedziałbym, że jedną dużą różnicą pomiędzy wzorcem Observer/Pubsub i po prostu wydarzeniami prostymi jest to, że intensywne wykorzystanie zdarzeń może wprowadzić bardzo ścisłe połączenie między obiektami w systemie, podczas gdy obserwator lub centrum jako pośrednik promuje luźniejsze sprzężenie - obiekt subskrybowany do określonego tematu nie musi mieć żadnej "wiedzy" o obiekcie, który publikuje dany temat. – natlee75

6

Dyfrakcja nr 1 może polegać na tym, że systemy zdarzeń zawsze mają eventdispatchthread, który oddziela obserwatory od swoich obserwatorów, więc zdarzenia mogą nie dotrzeć natychmiast do obserwatorów. Podczas gdy rzeczywiste obserwowalne bezpośrednio wywołują metody obserwatora, obserwowane przez zdarzenia obserwowalne upuszczają swoje zdarzenia w kolejkę zdarzeń. Następnie EDT przekazuje te zdarzenia zarejestrowanym słuchaczom.

10

Kiedy nastąpi zmiana stanu przez wydawcę lub tematu,

  • Event Driven Architecture (architektura wiadomość jest napędzany), odpowiedzialny dostarczyć wiadomość do Abonenta, asynchronicznie.

  • Wzorzec obserwacyjny (jest wzorcem projektowym oprogramowania), odpowiedzialny za polecenie polecenie Subskrybent, aby coś zrobić synchronicznie.

1

Szukałem trochę dla tego samego pytania. Dla tego wątku, znajduję punkt od Angel O'Sphere na "Jaka semantyka" i punkt z Spaceratu na "Dispatcherze" pomaga.

Te dwa punkty to moje zrozumienie, które odróżniają Parzysty-Kierowca od Wzoru Obserwatora. Przynajmniej z kanonicznego wyjaśnienia, "Wzorzec Obserwatora" zwykle oznacza natychmiastowe nadawanie, gdy "Temat" się zmienił, a "Dyspozytornia" została zaimplementowana poprzez wywołanie interfejsu dostarczonego przez subskrybenta lub słuchacza. W przypadku Event-Driven zawsze istnieje kolejna warstwa pomiędzy "Subject a" Observer ", zwana" Dispatcherem "lub" Event Queue ". Zapewnia to" opóźnioną "obsługę w celu zmniejszenia użycia procesora, a także zapewnia pewną zdolność do wywoływania różnych Interfejsy zależą od innego typu zdarzenia:

0

Podstawową różnicą w obu przypadkach jest zachowanie sprzężenia i synchroniczne Jeżeli utrzymamy wzorzec obserwatora, mówimy, że jest tylko jedno źródło sygnału i byłby on synchroniczny, podczas gdy z drugiej strony ze zdarzeniami , oddzielamy obie strony, aby działały niezależnie i jednocześnie będą miały możliwość posiadania więcej niż jednego źródła zdarzeń w przyszłości bez żadnych zmian w kodzie Zdarzenia pomagają nam objąć asynchroniczne jako projektowanie Wszystkie biblioteki programowania Reactive zapewniają bardzo dobre wsparcie dla zdarzeń sterowanych projekt

0

Od Wikipedia:

Wzorzec Obserwator jest wzorzec projektowania oprogramowania, w którym przedmiot, nazywa przedmiot, utrzymuje listę jego utrzymaniu, zwany obserwatorów, i powiadamia je automatycznie o wszelkich zmianach stanu, zazwyczaj przez wywołanie jednej z ich metod.

Służy głównie do wdrażania rozproszonych systemów obsługi zdarzeń w oprogramowaniu "sterowanym zdarzeniami" w . Większość współczesnych języków, takich jak Java i C# , ma wbudowane konstrukcje "zdarzeń", które implementują komponenty modelu obserwatora , dla łatwego programowania i krótkiego kodu.

Wzorzec obserwatora o wzorze jest nieco bardziej abstrakcyjny i teoretyczny. Zdarzenia to jedna (zwykle wbudowana) implementacja implementacji, jednak jak zauważono w odpowiedziach Anioła Zdarzenia mają tendencję do używania w kilku innych sytuacjach, z wyjątkiem tego, co jest ściśle zdefiniowane we wzorcu obserwatora.

Powiązane problemy