观察者模式更新参数

时间:2017-12-03 00:22:34

标签: java observable observer-pattern

为什么Observer接口有 Observable o 作为参数? 您是否建议使用Javas现有类(实现Observer;扩展Observable)?

  public class Test implements Observer {
  void update(Observable o, Object arg);
  }

2 个答案:

答案 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中,不推荐使用ObserverObservable

  

已过时。这个类和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");
    }

}