我读过一本名为" Head First Pattern"并对模式" Observer"。
提出疑问如果观察者的API仅包含1种方法" update()"?
,观察者如何订阅观察者?首先,我假设观察者必须包含方法" subscribe(Observable observable)"
如何以最佳方式实施订阅机制?
答案 0 :(得分:2)
实际上,反之亦然。您将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);
}
}
请记住,这是一个例子。您必须通过添加,删除等来管理您的观察者。code to an interface也建议您这样做,因此您应该根据要观察的内容创建自己的Observer
界面。
此外,您不应该使用java提供的实现,因为它在Java 9中已弃用: https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html https://dzone.com/articles/javas-observer-and-observable-are-deprecated-in-jd
如果你想要更可靠和反应更强的东西。看一眼: https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html
干杯!
答案 1 :(得分:0)
observable.addObserver(observer);
// now when observable changes, the observer will know