Java 观察者和订阅者之间的区别是什么?

Java 观察者和订阅者之间的区别是什么?,java,rx-java,Java,Rx Java,我试图破译以下函数: Subscription getCar(id, Observer<Car> observer) { return getCarDetails(id, new Observer<CarDetails> { @Override onNext(CarDetails details) {

我试图破译以下函数:

Subscription getCar(id, Observer<Car> observer) {
    return getCarDetails(id, new Observer<CarDetails> {
                             @Override
                             onNext(CarDetails details) {           
                                 observer.onNext(details.getCar());
                             } });
}
订阅getCar(id,观察员){ 返回GetCardDetails(id,新观察者{ @凌驾 onNext(卡片详细信息){ onNext(details.getCar()); } }); } 我从中获得了rxjava的一个很好的介绍,但它只是顺便提到了Observable,说您将在大多数时间使用Subscriber来消费Observable发出的项目

谁能给我解释一下吗

  • 什么是观察者
  • 观察者与订阅者有何不同
  • 上面的代码片段是做什么的

  • 让它看起来像一个订户。订户的javadoc表示它实现了observer和subscription。我很困惑。

    编辑:用@Alrid的评论

    tl;dr

    public abstract class Subscriber<T> implements Observer<T>, Subscription
    
    公共抽象类订阅者实现了观察者、订阅
    
    所以a是的一个实现,在订阅上有额外的语义(更多的是关于取消订阅)。 您问题中的代码只是表明它通过了
    Observer
    接口,而不是实现(通常的编程实践)

    此外,此代码还返回一个
    订阅
    ,这可能是因为此代码的作者认为客户机应该只能访问
    订阅
    方法,而不能访问可观察对象生成的元素。这可能是程序员的错误

    说来话长

    确实,您应该阅读本网站(或本书)的内容: 它是关于Rx.Net的,但是概念是非常相同的,它们是由Erik Meijer和RxJava实现者创建的(如果适用于Java语言)

    您将对本页感兴趣(这是第二章):

    在这里,您将阅读第一段:

    在使用Rx时,有两种关键类型需要理解,还有一种辅助类型可以帮助您更有效地学习Rx。IObserver和IObservable构成了Rx的基本构建块,而ISubject的实现减少了Rx新手的学习曲线

    基本上,Rx是建立在观察者模式的基础上的。NET已经公开了一些实现观察者模式的其他方法,例如多播委托或事件(通常是多播委托)

    即使类型/API有点不同,您也会从本书中学到很多东西,可能比使用一些博客要多得多

    这本书没有说什么(…因为它在RxJava实现中)

    RxJava主要开发人员此时引入了一个细微的变化(参见PR),允许区分两种类型的合同:

    • 通知->
      观察员
    • (联合国)订阅->
      订阅
    这一更改允许更好地表达/分离RxJava库实现类的这些关注点

    然而,作为库用户,使用RxJava库的实际实现应该足够好了

    实现订阅者需要更多的知识、工作和关注,事实上,订阅语义非常重要,这取决于可观察到的源的类型(热或冷?创建成本高?)


    在上述情况下,公开
    订阅者
    而不是
    观察者
    在大多数情况下不会干扰代码,但除非需要这些非订阅语义,否则它不是它的预期用途。但最终实现
    订户
    ,可能会陷入一些陷阱,例如:

  • 将资源用于您不会使用的功能
  • 无法从其他类继承
  • 写入不正确的联合国订阅代码
  • 复制/粘贴代码错误的代码或为不同上下文编写的正确代码
  • (编辑:这显然只适用于RxJava1。)

  • 观察者
    是可以从数据源(可观察的
    对象)获取数据的对象。数据源通过调用观察者的
    onNext()
    将数据推送到它

  • 订户
    是一个
    观察者
    ,也可以从该数据源(通过
    订阅
    界面)取消订阅

  • 函数试图返回汽车,但是没有直接的方法。但是有一个获取汽车详细信息的函数(
    getCarDetails()
    ),它将调用一个具有所有汽车详细信息的观察者。因此,它调用该函数并将其传递给观察者,当它获取数据时,将从细节中获取汽车数据并将其传递给自己的观察者


  • RxJava 2中的org.reactivestreams.Subscriber
    是一个符合

    与可观察的主要区别在于新的订户支持背压

    Observer
    订阅了
    observatable
    订阅者
    订阅了
    Flowable
    (实现
    org.reactivestreams.Publisher


    请参阅详细说明。

    同样在RxJava2中,如果您希望能够取消订阅,您应该使用
    ResourceObserver
    进行
    Observable
    操作,使用
    ResourceSubscriber
    进行
    Flowable
    操作


    检查此项

    这是模式vs。它们很相似,但有细微的区别。@SeanPatrickFloyd:你能解释一下区别吗?什么是“细节”变量?这在RxJava 2中是不正确的,订阅者和观察者是两个完全不同的接口。两者都没有扩展otherIn 2.x Observer用于订阅可观察对象,而Subscriber用于订阅可流动对象,Subscriber不再实现Observe