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