将类定义为Observable和Observer

MBZ*_*MBZ 5 java design-patterns observer-pattern

从技术上讲,似乎可以将a定义Class为两者ObservableObserver使用以下代码:

public class Data extends Observable implements Observer
Run Code Online (Sandbox Code Playgroud)

但是,试图实现它,它不起作用.

public class Data extends Observable implements Observer {

    @Override
    public void update(Observable o, Object o1) {
        System.out.println("SC");        
    }

    Integer A;
    String B;
    Float C;

    public Data() {
        this.addObserver(this);
    }

    public void setA(Integer A) {
        this.A = A;
        notifyObservers();
    }

    public void setB(String B) {
        this.B = B;
        notifyObservers();
    }

    public void setC(Float C) {
        this.C = C;
        notifyObservers(this.C);
    }

}
Run Code Online (Sandbox Code Playgroud)

main如下功能:

public static void main(String[] args) {
    Data d = new Data();
    d.setA(5);
    d.setB("Hi");
    d.setC(2.0f);
}
Run Code Online (Sandbox Code Playgroud)

它应该打印一些"SC",但它不起作用.谁能描述为什么?

Bru*_*eis 6

如果不这样做.setChanged(),则.notifyObservers()无效.如果你有单独的类定义Observable和Observers,或者如果你有一个类,就像在你的例子中一样.

尝试更改您的setter,如下所示:

public void setC(Float C) {
  this.C = C;
  setChanged();  // <-- add this line
  notifyObservers(this.C);
}
Run Code Online (Sandbox Code Playgroud)

从文档中Observable,

setChanged() 将此Observable对象标记为已更改 ; 该hasChanged方法现在将返回true.

notifyObservers(Object arg) 如果此对象已更改(如hasChanged方法所示),则通知其所有观察者,然后调用该clearChanged方法以指示此对象不再更改.