gpt4 book ai didi

java - 观察者和订阅者有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 11:45:54 25 4
gpt4 key购买 nike

我正在尝试破译以下函数:

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,说您将在大部分时间使用订阅者来消费从 Observable 发出的项目。

谁能给我解释一下

  1. 什么是观察者?
  2. 观察者与订阅者有何不同?
  3. 上面的代码片段有什么作用?

Javadoc让它看起来就像一个订阅者。订阅者的 javadoc 说它实现了观察者和订阅。我很困惑。

最佳答案

已编辑:带有@Alrid 的评论

tl;dr

public abstract class Subscriber<T> implements Observer<T>, Subscription

所以 SubscriberObserver 的实现,在订阅上有额外的语义(更多的是关于取消订阅)。您问题中的代码只是表明它通过了 Observer 接口(interface),而不是实现(通常的编程实践)。

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

长篇大论

您真的应该阅读本网站(或书籍)的内容:http://www.introtorx.com它是关于 Rx.Net,但概念是相同的,它们是由 Erik Meijer 创建的,RxJava 实现者遵循 them (如果适用于 Java 语言)。

这个页面会让你感兴趣(这是第二章):KeyTypes

您将在此处阅读第一段:

There are two key types to understand when working with Rx, and a subset of auxiliary types that will help you to learn Rx more effectively. The IObserver and IObservable form the fundamental building blocks for Rx, while implementations of ISubject reduce the learning curve for developers new to Rx.

...

Essentially Rx is built upon the foundations of the Observer pattern. .NET already exposes some other ways to implement the Observer pattern such as multicast delegates or events (which are usually multicast delegates).

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

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

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

  • 通知 -> 观察者
  • (取消)订阅 -> 订阅

此更改允许更好地表达/拆分 RxJava 库的实现类的这些问题。

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

实现订阅者需要更多的知识、工作和关心,实际上订阅语义非常重要,具体取决于可观察源的类型(热还是冷?创建成本高吗?)


在上述情况下暴露 Subscriber 而不是 Observer 在大多数情况下不会干扰代码,但这不是它的预期用途,除非那些不- 需要订阅语义。但最终实现 Subscriber,可能会陷入一些陷阱,例如:

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

关于java - 观察者和订阅者有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27664221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com