当前位置: 首页 > 面试题库 >

观察者和订阅者之间有什么区别?

侯池暝
2023-03-14
问题内容

我试图破译以下功能:

Subscription getCar(id, Observer<Car> observer) {
    return getCarDetails(id, new Observer<CarDetails> {
                             @Override
                             onNext(CarDetails details) {           
                                 observer.onNext(details.getCar());
                             } });
}

我从http://blog.danlew.net/2014/09/15/grokking-rxjava-
part-1/
获得了一个很好的rxjava简介,但是它只是顺便提到了Observer,说您将在大多数情况下使用Subscriber从Observable发射到消费项目的时间。

有人可以向我解释

  1. 什么是观察者?
  2. 观察者与订户有何不同?
  3. 上面的代码段是做什么的?

Javadoc使它看起来像订户。订阅者的Javadoc表示它实现了观察者和订阅。我很困扰。


问题答案:

编辑 :@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已经公开了实现观察者模式的其他方法,例如多播委托或事件(通常是多播委托)。

即使类型/ API有所不同,您也可以从这本书中学到很多东西,可能比从一些博客中学到的更多。

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

RxJava的主要开发人员此时引入了一些细微的变化(请参阅PR
#792),从而可以区分两种类型的合同:

  • 通知-> Observer
  • 订阅-> Subscription

这项更改可以更好地表达/分割RxJava库实现类的这些问题。

但是,作为库用户,使用RxJava库的实际实现应该足够好。

实现订户需要更多的知识,工作和维护,实际上,订户的语义非常重要,具体取决于可观察到的源的类型(热还是冷?创建昂贵?)

在大多数情况下,公开Subscriber而不是Observer在上述情况下不会干扰代码,但是除非需要那些取消订阅的语义,否则它不是预期的用途。但最终实施Subscriber和可能涉及陷入一些陷阱,例如:

  1. 将资源用于您不会使用的功能
  2. 不能从另一个类继承
  3. 输入不正确的退订代码
  4. 复制/粘贴代码不正确的代码或为其他上下文编写的正确代码


 类似资料:
  • 我正在尝试破译以下函数: null

  • 从这个留档: RxJS为JavaScript引入了一个新的Push系统。可观察对象是多个值的生产者,将它们“推送”给观察者(消费者)。 订阅可观察对象类似于调用函数。 要调用可观察对象,我们应该从可观察对象本身调用函数,并将观察者作为可观察对象提供的数据的使用者传递,如: 本文件还说明: 什么是观察者?观察者是被观察者所传递价值的消费者。观察者只是一组回调,每个回调对应于被观察者发送的每种类型的通

  • 本文向大家介绍JavaScript设计模式之观察者模式(发布者-订阅者模式),包括了JavaScript设计模式之观察者模式(发布者-订阅者模式)的使用技巧和注意事项,需要的朋友参考一下 观察者模式( 又叫发布者-订阅者模式 )应该是最常用的模式之一. 在很多语言里都得到大量应用. 包括我们平时接触的dom事件. 也是js和dom之间实现的一种观察者模式. 只要订阅了div的click事件. 当点

  • 问题内容: 我无法理解以下文本…这是否意味着空的构造函数?为什么拥有两个不同的版本很重要? https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html 在Java虚拟机级别,每个构造函数(第2.12节)都作为具有特殊名称的实例初始化方法出现。该名称由编译器提供。因为该名称不是有效的标识符,所以不能直接用Java编程语言编写的程序中使

  • 我正在浏览微软的Rust教程,它是关于 实现函数,以便返回对插入向量中的值的引用 这里给出了解决方案,但它与我的不同之处在于它使用了 除了返回类型之外,我的和标准解决方案之间的另一个区别是,我只是简单地返回了参数,而标准解决方案使用复杂方式)。 我想知道我的解决方案是否有任何问题,本教程采取了另一种方式? 虽然@Masklin为我的问题提供了一个很好的答案,但它有点特定于我给出的示例,但没有直接解

  • 我有这个问题,我一直在寻找,但找不到解决方案(或者也许我不能根据其他答案做出解决方案)。 我的问题是,我需要找到一种方法来等待可观察的(有自己的订户)并等待另一个可观察的(有自己的订户)完成。 场景是这样的: 奥布1- 奥布斯2 - 我主要担心的是我需要两个订阅者。在我看来,obs1 和 obs2 并行运行,但需要检查 obs1 是否以新的会话令牌完成。也许这不是RxJava的主要目的。 Obs1