Różnica między Observer, Pub/Sub i powiązaniem danych

Jaka jest różnica między Wzór obserwatora, Publikuj / Subskrybuj, oraz powiązanie danych?

Szukałem trochę na Stack Overflow i nie znalazłem żadnych dobrych odpowiedzi.

Doszedłem do wniosku, że powiązanie danych jest terminem ogólnym i istnieją różne sposoby jego implementacji, takie jak wzór obserwatora lub wzór Pub/Sub. Ze wzorem obserwatora, obserwowalny aktualizuje swoje Obserwatorzy. Z Pub/Sub, 0-wielu wydawców może publikować wiadomości niektórych klas I 0-wielu subskrybentów może subskrybować wiadomości niektórych klas.

Czy istnieją inne schematy implementacji "powiązania danych"?

Author: Yangshun Tay, 2013-03-24

4 answers

Oto moje spojrzenie na trójkę:

Powiązanie Danych

Zasadniczo, w rdzeniu oznacza to po prostu " wartość właściwości X na obiekcie Y jest semantycznie związana z wartością właściwości a na obiekcie B. nie przyjmuje się żadnych założeń co do tego, jak y zna lub jest karmione zmiany na obiekcie B.

Observer, or Observable / Observer

Wzorzec projektowy, dzięki któremu obiekt jest nasycony zdolnością powiadamiania innych o określonych zdarzeniach - zazwyczaj odbywa się to za pomocą rzeczywistych zdarzeń, które są w rodzaju szczeliny w obiekcie o kształcie określonej funkcji/metody. Obserwowalny to ten, który dostarcza powiadomienia, a obserwator otrzymuje te powiadomienia. W. Net obserwowalny może ujawnić Zdarzenie, a obserwator subskrybuje to zdarzenie za pomocą Hooka w kształcie "obsługi zdarzenia". Nie przyjmuje się założeń co do specyficznego mechanizmu, w którym występują powiadomienia, ani co do liczby obserwatorów, których jeden obserwowalny może powiadomić.

Pub / Sub

Inna nazwa (być może z więcej semantyka "broadcast") wzorca obserwowalnego / obserwatora, co zwykle oznacza bardziej" dynamiczny "smak-obserwatorzy mogą subskrybować lub zrezygnować z subskrypcji powiadomień, a jeden obserwowalny może "krzyczeć" do wielu obserwatorów. W. NET można do tego użyć standardowych zdarzeń, ponieważ zdarzenia są formą MulticastDelegate, a więc mogą wspierać dostarczanie zdarzeń do wielu subskrybentów, a także wspierać wypisywanie się. Pub / Sub ma nieco inne znaczenie w pewnych kontekstach, zwykle obejmujące więcej "anonimowość" między eventem a eventerem, co może być ułatwione przez dowolną liczbę abstrakcji, zwykle z udziałem jakiegoś "środkowego człowieka" (takiego jak Kolejka komunikatów), który zna wszystkie strony, ale poszczególne strony nie wiedzą o sobie nawzajem.

Wiązanie Danych, Redux

W wielu wzorcach "podobnych do MVC", obserwowalny wyświetla pewien sposób "powiadomienia o zmianie właściwości", który zawiera również informacje o konkretnej zmianie właściwości. Obserwator jest niejawny, zwykle tworzony przez Framework i subskrybuje te powiadomienia za pomocą wiążącej składni, aby konkretnie zidentyfikować obiekt i właściwość, a "obsługa zdarzeń" po prostu kopiuje nową wartość, potencjalnie uruchamiając logikę aktualizacji lub odświeżania.

Data binding re Redux

Alternatywna implementacja wiązania danych? Ok, tu jest głupia:

  • uruchamiany jest wątek tła, który stale sprawdza przypisaną właściwość obiektu.
  • Jeśli ten wątek wykryje, że wartość właściwości zmieniła się od ostatniego sprawdzenia, skopiuj wartość do powiązanego elementu.
 147
Author: JerKimball,
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-12-31 03:25:24

Istnieją dwie główne różnice między wzorcami obserwatora/obserwowalnego i wydawcy/Abonenta:

  1. Observer / Observable wzorzec jest najczęściej implementowany w synchroniczne way, czyli obserwowalny wywołuje odpowiednią metodę wszystkich swoich obserwatorów, gdy zachodzi jakieś zdarzenie. Wzór Wydawca / Abonent jest najczęściej realizowany w asynchroniczne sposób (za pomocą kolejki komunikatów).

  2. W Observer / Observable pattern, the obserwatorzy są świadomi obserwowalnych. Natomiast w Wydawca / Subskrybent, wydawcy i subskrybenci nie musimy się znać.. Po prostu komunikują się za pomocą kolejek wiadomości.

Jak wspomniałeś poprawnie, powiązanie danych jest terminem ogólnym i może być zaimplementowane za pomocą metody Observer/Observable lub Publisher / Subscriber. Data jest wydawcą/abonentem.

 159
Author: Param,
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-01-09 20:19:25

Jestem trochę rozbawiony, że wszystkie odpowiedzi tutaj starały się wyjaśnić subtelną różnicę między obserwatora i Pub / Sub wzorców bez podawania konkretnych przykładów. Założę się, że większość czytelników nadal nie wie, jak zaimplementować każdy z nich, czytając jeden jest synchroniczny, a drugi jest asynchroniczny.

Należy zwrócić uwagę na jedną rzecz: celem tych wzorców jest próba oddzielenia kodu

Obserwator jest wzorcem projektowym, w którym obiekt (znany jako podmiot) utrzymuje lista obiektów w zależności od niej (obserwatorów), automatycznie powiadamiająca o wszelkich zmianach stanu.

wzór obserwatora

Oznacza to, że observable object ma listę, na której przechowuje wszystkie swoje observers (które zazwyczaj są funkcjami). i może przemierzać tę listę i wywoływać te funkcje, gdy czuje się dobrze.

Zobaczten wzór obserwatora przykład dla szczegółów.

Ten wzorzec jest dobry, gdy chcesz słuchać zmian danych na odpowiednio obiektować i aktualizować inne widoki interfejsu użytkownika.

Ale minusami są Obserwable utrzymują tylko jedną tablicę do utrzymywania obserwatorów (w przykładzie tablica to observersList).

Nie rozróżnia sposobu uruchomienia aktualizacji, ponieważ posiada tylko jedną notify function, która uruchamia wszystkie funkcje zapisane w tej tablicy.

Jeśli chcemy grupować obserwatorów na podstawie różnych zdarzeń. Musimy tylko zmodyfikować to observersList na Object Jak

var events = {
    "event1": [handler1, handler2],
    "event2": [handler3]
}

Zobacz to przykład pubsub dla szczegółów.

I ludzie nazywają tę odmianę pub/sub. Możesz więc uruchamiać różne funkcje w oparciu o events, które opublikowałeś.

 27
Author: Qiang,
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
2020-06-20 09:12:55

Zgadzam się z wnioskiem o obu wzorców, niemniej jednak, dla mnie, używam obserwowalnych, gdy jestem w tym samym procesie i używam Pub / Sub w scenariuszach między procesami, gdzie wszystkie strony znają tylko wspólny kanał, ale nie Strony.

Nie znam innych szablonów, albo powiem tak, nigdy nie potrzebowałem innych szablonów do tego zadania. Nawet większość frameworków MVC i implementacji wiązań danych używa zazwyczaj wewnętrznie koncepcji observer.

Jeśli jesteś zainteresowany komunikacja międzyprocesowa, polecam:

"wzorce integracji przedsiębiorstw: projektowanie, budowanie i wdrażanie rozwiązań do przesyłania wiadomości" [8]} - http://www.addison-wesley.de/9780321200686.html

Ta książka zawiera wiele pomysłów na to, jak wysyłać wiadomości między procesami lub klasami, które mogą być używane nawet w wewnątrzprocesowych zadaniach komunikacyjnych(pomogło mi to programować w bardziej luźny sposób).

Mam nadzieję, że to pomoże!

 9
Author: Rafa,
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-12-18 15:49:51