EDITED: с комментарием @ Alrid
tl; dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
Итак, подписчик является реализация Observer, с дополнительной семантикой по подписке (это больше об отказе от подписки). Код в вашем вопросе просто показывает, что он передает интерфейс Observer
, а не реализацию (обычная практика программирования).
Также этот код возвращает 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
может повлечь за собой некоторые подводные камни, такие как:
- тратить ресурсы на функциональность, которую вы не будете использовать
- не может наследовать от другого класса
- напишите неверный код отмены подписки
- скопировать / вставить код неправильный код или правильный код, написанный для другого контекста
person
Brice
schedule
27.12.2014