EDITED : с комментарием @ Alrid
tl; dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
Таким образом, подписчик - это реализация Observer с дополнительной семантикой подписки (это больше касается отмены подписки). Код в вашем вопросе просто показывает, что он передает Observer
интерфейс, а не реализацию (обычная практика программирования).
Также этот код возвращает a Subscription
, это может быть связано с тем, что автор этого кода считал, что клиент должен иметь доступ только к Subscription
методам, без доступа к элементам, созданным наблюдаемым объектом. Это может быть ошибка программиста.
длинная история
На самом деле вам следует прочитать содержимое этого веб-сайта (или книги): http://www.introtorx.com
Речь идет о Rx.Net, но концепции те же самые, они были созданы Эриком Мейджером, а разработчики RxJava последовали за ними ( если применимо к языку Java).
Эта страница вас заинтересует (это вторая глава): KeyTypes
Здесь вы прочтете в первых абзацах:
При работе с Rx необходимо понимать два ключевых типа и подмножество вспомогательных типов, которые помогут вам более эффективно изучить Rx. IObserver и IObservable образуют фундаментальные строительные блоки для Rx, в то время как реализации ISubject сокращают время обучения для разработчиков, плохо знакомых с Rx.
...
По сути, Rx построен на основе паттерна Observer. .NET уже предоставляет некоторые другие способы реализации паттерна Observer, такие как многоадресные делегаты или события (которые обычно являются многоадресными делегатами).
Даже если типы / API немного отличаются, вы многому научитесь из этой книги, возможно, намного больше, чем из некоторых блогов.
О чем в этой книге не говорится ( ... потому что это есть в реализации RxJava )
Главный разработчик RxJava в это время представил небольшую вариацию (см. PR # 792 ), которая позволила различать два типа контрактов:
- уведомление ->
Observer
- (от) подписка ->
Subscription
Это изменение позволило лучше выразить / разделить эти проблемы реализующих классов библиотеки RxJava.
Однако для пользователя библиотеки использование реальных реализаций библиотеки RxJava должно быть достаточно хорошим.
Внедрение подписчика требует гораздо больше знаний, работы и внимания, ведь семантика подписки очень важна в зависимости от типа наблюдаемого источника (горячий или холодный? Дорогое создание?)
Предоставление, Subscriber
а не Observer
в случаях, подобных описанным выше, в большинстве случаев не будет мешать работе кода, но это не его предполагаемое использование, если только эта семантика отмены подписки не требуется. Но, в конце концов, реализация Subscriber
и может привести к некоторым подводным камням, таким как:
- тратить ресурсы на функциональность, которую вы не будете использовать
- не может наследовать от другого класса
- напишите неверный код отмены подписки
- скопировать / вставить код неправильный код или правильный код, написанный для другого контекста