![](/img/trans.png)
[英]How to subscribe multiple Observers on a single Observable with RxJava?
[英]How observers subscribe on observables?
我已经读过一本名为《 Head First Pattern》的书,并且对“ Observer”模式有疑问。
如果观察者的API仅包含1个方法“ update()”,那么观察者应如何订阅它呢?
首先,我假设观察者必须包含方法“ subscribe(Observable observable)”
如何以最佳方式实施订阅机制?
实际上,这是另一回事。 您将Observer
附加或添加到将被观察的对象Observable
。 这样做是为了使观察到的对象一旦状态改变就能够notify
观察者。
在这种模式中,如果您要在观察者对象中订阅Subject
,则只能这样做。 观察者如何知道行为发生时对象的状态何时发生变化? 也许观察者可以开始轮询并询问对象的状态,直到状态改变为止,然后观察者将对此采取行动。 但这远非理想。
这就是WatchService
所发生的情况,例如,您在其中将文件添加到服务中以便在文件被修改后得到通知。 大致来说,您是在观察者中“订阅”主题。 但是,在这里,您将启动一项服务,该服务将照顾您的幕后需求。
无论如何,在您的情况下,最好的方法是让主题对象管理观察者并在适当的时候调用它。
查看此链接: https : //sourcemaking.com/design_patterns/observer
您必须实现您的Subject
类,以便它接收将观察其行为并根据需要通知的实体。 当进行了所需的更改时, Subject's
责任notify
观察者。
Java有其自己的模式实现。 您应该先阅读Observable类以获取要点。 然后,您应该按照已阅读的指南实施自己的指南。 这个想法是这样的:
import java.util.ArrayList;
import java.util.List;
public class TestObserver {
public static void main(String[] args) {
Subject subject = new Subject();
ContentObserver contentObs = new ContentObserver();
subject.addObserver(contentObs);
// Once you call setContent, the object contentObs
// will be notified and print the desired text
subject.setContent("test");
}
}
class Subject {
private String content;
private List<ContentObserver> observers = new ArrayList<>();
public void addObserver(ContentObserver obs) {
observers.add(obs);
}
public void setContent(String content) {
this.content = content;
notifyContentObservers();
}
private void notifyContentObservers() {
observers.forEach(obs -> obs.update(content));
}
}
class ContentObserver {
public void update(String content) {
System.out.println("Content was changed! New content = " + content);
}
}
请记住,这是一个示例。 您必须通过添加,删除等方式来管理观察者。也建议对接口进行编码 ,因此您应该根据要观察的内容创建自己的Observer
接口。
此外,你不应该使用Java提供的实现,因为它在Java 9弃用: https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html https://开头dzone。 COM /用品/ Java类观察者和观察的,被弃用,在-JD
如果您想要更可靠和反应更快的产品。 看看: https : //docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html
干杯!
observable.addObserver(observer);
// now when observable changes, the observer will know
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.