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),允许区分两种类型的合同:
- 通知->
观察员
- (联合国)订阅->
订阅
在上述情况下,公开
订阅者
而不是观察者
在大多数情况下不会干扰代码,但除非需要这些非订阅语义,否则它不是它的预期用途。但最终实现订户
,可能会陷入一些陷阱,例如:
观察者
是可以从数据源(可观察的对象)获取数据的对象。数据源通过调用观察者的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