为什么Observer接口有 Observable o 作为参数? 您是否建议使用Javas现有类(实现Observer;扩展Observable)?
public class Test implements Observer {
void update(Observable o, Object arg);
}
答案 0 :(得分:3)
它会收到Observable
引用,以便Observer
可以使用它来解决它处理传递的Object
arg的方式。此外,Observer
可以在完成作业后调用deleteObserver
自行删除。
你不应该使用它们。并不是我告诉你的,这是java背后的人。看看:
https://dzone.com/articles/javas-observer-and-observable-are-deprecated-in-jd https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html
在Java 9中,不推荐使用Observer
和Observable
。
已过时。这个类和Observer接口已经有了 弃用。 Observer和Observable支持的事件模型是 非常有限,Observable提供的通知顺序是 未指定,状态变化不是一对一的对应关系 有通知。对于更丰富的事件模型,请考虑使用 java.beans包。对于线程之间可靠且有序的消息传递 考虑使用其中一个并发数据结构 java.util.concurrent包。对于反应流样式编程, 请参阅Flow API。
看看这个其他答案: How observers subscribe on observables?
答案 1 :(得分:0)
如果使用此模式,则需要Observer和Observables。
public class Airport extends Observable {
private final String name;
public Airport(String name) {
this.name = name;
}
public void planeLanded(String flight) {
setChanged();
notifyObservers(flight);
}
@Override
public String toString() {
return name;
}
}
public class DispatcherScreen implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("Flight " + arg + " landed at " + o.toString());
}
}
public class Program {
public static void main(String[] args) {
Observer screen = new DispatcherScreen();
Airport airport1 = new Airport("San Francisco International Airport");
Airport airport2 = new Airport("O'Hare International Airport");
airport1.addObserver(screen);
airport2.addObserver(screen);
//
airport1.planeLanded("FR1154");
airport1.planeLanded("UI678");
airport2.planeLanded("SU1987");
airport1.planeLanded("UI678");
airport2.planeLanded("AI4647");
}
}