Observer与Observable关系

来源:互联网 发布:js 数组里的对象去重 编辑:程序博客网 时间:2024/04/29 18:43

 

以下纯粹为自己的理解:

 

Observer观察者;

Observable 被观察者;

 

1.根据文档,Observable有一个管理者的集合,在数据发生改变时,可以通知所有观察者对象;

2.在构建观察者时,需要加入到被观察者的集合中,被观察者发现在数据改变时,调用setChanged(),标记位,notifyObservers()执行,并可以传递数据;

3.在Observer中,回调update(),得到数据根据需要执行下一步;

4.Observer对象销毁前一定要用deleteObserver将其从列表中删除,不然因为还存在对象引用的关系,Observer对象不会被垃圾收集,造成内存泄漏,并且已死的Observer仍会被通知到,有可能造成意料外的错误,而且随着列表越来越大,notifyObservers操作也会越来越慢。

附上Observable方法:

 

addObserver

public void addObserver(Observer o)
如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者。未指定向多个观察者发送通知的顺序。请参阅该类的注释。

参数:
o - 要添加的观察者。
抛出:
NullPointerException - 如果参数 o 为 null。


deleteObserver

public void deleteObserver(Observer o)
从对象的观察者集合中删除某个观察者。向此方法传递 null 将使其无效。

参数:
o - 要删除的观察者。

notifyObservers

public void notifyObservers()
如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。

每个观察者都有其 update 方法,其调用参数有两个:observable 对象和 null。换句话说,此方法等效于:

notifyObservers(null)

另请参见:
clearChanged(), hasChanged(), Observer.update(java.util.Observable, java.lang.Object)

notifyObservers

public void notifyObservers(Object arg)
如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。

每个观察者都有其 update 方法,其调用参数有两个:observable 对象和 arg 参数。

参数:
arg - 任意对象。
另请参见:
clearChanged(), hasChanged(), Observer.update(java.util.Observable, java.lang.Object)


deleteObservers

public void deleteObservers()
清除观察者列表,使此对象不再有任何观察者。


setChanged

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


clearChanged

protected void clearChanged()
指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasChanged 方法将返回 falsenotifyObservers 方法自动调用此方法。

另请参见:
notifyObservers(), notifyObservers(java.lang.Object)

hasChanged

public boolean hasChanged()
测试对象是否改变。

返回:
当且仅当在此对象上最近调用了 setChanged 方法,而不是 clearChanged 方法时,才返回true;否则返回 false
另请参见:
clearChanged(), setChanged()


countObservers

public int countObservers()
返回 Observable 对象的观察者数目。

返回:
对象的观察者数目。

0 0
原创粉丝点击