将类定义为Observable和Observer

时间:2012-10-17 11:06:23

标签: java design-patterns observer-pattern

从技术上讲,使用以下代码将Class定义为ObservableObserver似乎没问题:

public class Data extends Observable implements Observer
然而,试图实现它,它不起作用。

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);
    }

}

使用main函数,如下所示:

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

它应该打印一些“SC”但它不起作用。谁能描述为什么?

1 个答案:

答案 0 :(得分:6)

如果您没有.setChanged(),则.notifyObservers()无效。如果您有单独的类定义Observable和Observers,或者如果您有一个类,就像在您的示例中一样。

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

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

来自 Observable 的文档,

  

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

     

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