EDITIERT : mit @ Alrids Kommentar
tl; dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
Ein Abonnent ist also eine Implementierung des Observers mit zusätzlicher Semantik für das Abonnement (es geht mehr um das Aufheben des Abonnements). Der Code in Ihrer Frage zeigt nur, dass er die Observer
Schnittstelle anstelle der Implementierung (übliche Programmierpraxis) passiert .
Auch dieser Code gibt a zurück Subscription
, was möglicherweise daran liegt, dass der Autor dieses Codes der Meinung war, dass der Client nur Zugriff auf Subscription
Methoden haben sollte, ohne Zugriff auf Elemente, die vom Observable erzeugt werden. Das kann ein Programmiererfehler sein.
lange Geschichte
Eigentlich sollten Sie den Inhalt dieser Website (oder dieses Buches) lesen: http://www.introtorx.com
Es geht um Rx.Net, aber die Konzepte sind dieselben, sie wurden von Erik Meijer erstellt und RxJava-Implementierer folgten ihnen ( falls zutreffend für die Java-Sprache).
Diese Seite wird Sie interessieren (es ist das zweite Kapitel): KeyTypes
Hier lesen Sie in den ersten Absätzen:
Bei der Arbeit mit Rx sind zwei Schlüsseltypen zu verstehen, und eine Untergruppe von Hilfstypen, mit denen Sie Rx effektiver lernen können. Der IObserver und IObservable bilden die Grundbausteine für Rx, während Implementierungen von ISubject die Lernkurve für Entwickler, die Rx noch nicht kennen, verkürzen.
...
Im Wesentlichen basiert Rx auf den Grundlagen des Observer-Musters. .NET bietet bereits einige andere Möglichkeiten zum Implementieren des Observer-Musters an, z. B. Multicast-Delegaten oder Ereignisse (bei denen es sich normalerweise um Multicast-Delegaten handelt).
Auch wenn Typen / APIs etwas anders sind, werden Sie mit diesem Buch viel lernen, wahrscheinlich viel mehr als mit einigen Blogs.
Was dieses Buch nicht sagt ( ... weil es in der RxJava-Implementierung ist )
Der Hauptentwickler von RxJava führte zu diesem Zeitpunkt eine geringfügige Abweichung ein (siehe PR # 792 ), mit der zwei Arten von Verträgen unterschieden werden konnten:
- Benachrichtigung ->
Observer
- (un) Abonnement ->
Subscription
Diese Änderung ermöglichte es, diese Bedenken der implementierenden Klassen der RxJava-Bibliothek besser auszudrücken / aufzuteilen.
Als Bibliotheksbenutzer sollte es jedoch ausreichend sein, tatsächliche Implementierungen der RxJava-Bibliothek zu verwenden.
Die Implementierung eines Abonnenten erfordert viel mehr Wissen, Arbeit und Sorgfalt. In der Tat ist die Abonnementsemantik abhängig von der Art der beobachtbaren Quelle (heiß oder kalt? Teuer zu erstellen?) Sehr wichtig.
Das Belichten Subscriber
und nicht Observer
in den oben genannten Fällen beeinträchtigt den Code in den meisten Fällen nicht, ist jedoch nicht für die beabsichtigte Verwendung vorgesehen, es sei denn, diese Semantik für das Nichtabonnieren ist erforderlich. Aber am Ende wird die Implementierung von a Subscriber
und kann dazu führen, dass einige Fallstricke auftreten, wie z.
- Geben Sie Ressourcen für Funktionen aus, die Sie nicht verwenden werden
- kann nicht von einer anderen Klasse erben
- Schreiben Sie einen falschen Code für die Abmeldung
- Kopieren / Einfügen von Code Ein falscher Code oder ein korrekter Code, der für einen anderen Kontext geschrieben wurde