EDYTOWANE : z komentarzem @ Alrid
tl; dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
Czyli abonent jest implementacją obserwatora , z dodatkową semantyką przy subskrypcji (chodzi bardziej o anulowanie subskrypcji). Kod w twoim pytaniu pokazuje tylko, że przechodzi przez Observer
interfejs, a nie implementację (zwykła praktyka programowania).
Również ten kod zwraca a Subscription
, może to być spowodowane tym, że autor tego kodu uważał, że klient powinien mieć dostęp tylko do Subscription
metod, bez dostępu do elementów wytwarzanych przez to, co obserwowalne. To może być błąd programisty.
długa historia
Naprawdę powinieneś przeczytać zawartość tej strony (lub książki): http://www.introtorx.com
Chodzi o Rx.Net, ale koncepcje są takie same, zostały stworzone przez Erika Meijera, a realizatorzy RxJava podążali za nimi ( jeśli dotyczy języka Java).
Ta strona Cię zaciekawi (jest to rozdział drugi): Typy klawiszy
Tutaj przeczytasz w pierwszych akapitach:
Istnieją dwa kluczowe typy, które należy zrozumieć podczas pracy z Rx i podzbiór typów pomocniczych, które pomogą Ci efektywniej nauczyć się Rx. IObserver i IObservable tworzą podstawowe bloki konstrukcyjne dla Rx, podczas gdy implementacje ISubject skracają krzywą uczenia się deweloperów, którzy nie znają Rx.
...
Zasadniczo Rx jest zbudowany na podstawach wzorca Observer. NET udostępnia już inne sposoby implementacji wzorca obserwatora, takie jak delegaci multiemisji lub zdarzenia (które zwykle są delegatami multiemisji).
Nawet jeśli typy / API są nieco inne, wiele się nauczysz dzięki tej książce, prawdopodobnie o wiele więcej niż w przypadku niektórych blogów.
Czego ta książka nie mówi ( ... ponieważ jest w implementacji RxJava )
Główny programista RxJava w tym czasie wprowadził niewielką zmianę (patrz PR # 792 ), która pozwoliła wyróżnić dwa rodzaje umów:
- powiadomienie ->
Observer
- (nie) subskrypcja ->
Subscription
Ta zmiana pozwoliła lepiej wyrazić / podzielić te obawy dotyczące klas implementujących biblioteki RxJava.
Jednak jako użytkownik biblioteki korzystanie z rzeczywistych implementacji biblioteki RxJava powinno wystarczyć.
Wdrożenie abonenta wymaga znacznie więcej wiedzy, pracy i staranności, w istocie semantyka subskrypcji jest bardzo ważna w zależności od rodzaju obserwowalnego źródła (gorące czy zimne? Drogie w tworzeniu?)
Ujawnianie Subscriber
raczej niż Observer
w przypadkach takich jak powyżej nie będzie kolidować z kodem w większości przypadków, ale nie jest to jego zamierzone użycie, chyba że te semantyki bez subskrypcji są potrzebne. Ale ostatecznie wdrożenie Subscriber
a może wiązać się z wpadnięciem w pewne pułapki, takie jak:
- wydawać zasoby na funkcje, których nie będziesz używać
- nie może dziedziczyć z innej klasy
- napisz niepoprawny kod anulowania subskrypcji
- kopiuj / wklej kod nieprawidłowy kod lub poprawny kod napisany dla innego kontekstu