Observable类
这是位于jdk包java.util中的类,该类实现了简单的Observer模式中的ConcreateSubject角色。Observable类使用Vector保存一组Observer的引用。
提供了添加和删除这些Observer引用的方法:
public
synchronized
void
addObserver(Observer o)//
添加一个
Observer
public
synchronized
void
deleteObserver(Observer o)//
删除一个
Observer
public
synchronized
void
deleteObservers()//
删除所有的
Observer
你还可以统计有多少个Observer对象要求被通知,通过下面的方法:
public
synchronized
int
countObservers()
Observeable对象有一个布尔域,用来表示是否有数据发生改变(只有为真时才需要通知Observer对象),同时还提供了操纵这个域的方法:
private
boolean
changed
=
false
;
protected
synchronized
void
setChanged() {
changed
=
true
;
}
protected
synchronized
void
clearChanged() {
changed
=
false
;
}
public
synchronized
boolean
hasChanged() {
return
changed
;
}
当真的有数据发生改变的时候,就需要通知
Observer
对象,使用下面的两个方法:
publicvoid notifyObservers() {
notifyObservers(
null
);
}
public
void
notifyObservers(Object arg) {
Object[] arrLocal;
synchronized
(
this
) {
if
(!
changed
)
return
;
arrLocal =
obs
.toArray();
clearChanged();
}
for
(
int
i = arrLocal.
length
-1; i>=0; i--)
((Observer)arrLocal[i]).update(
this
, arg);
}
注意,这里除了构造函数所有的方法都是线程安全的,所以如果你只是在单线程环境里面使用
Observer
模式,出于性能的原因,或许需要寻找另外的解决方案。一个对象要想作为
Observer
被通知,它就需要实现自己的
update
方法。
Observer接口
public
interface
Observer {
void
update(Observable o, Object arg);
}
上面说到,“
一个对象要想作为
Observer
被通知,它就需要实现自己的
update
方法。
”
,因此
jdk
也提供了一个
Observer
接口,你的类可以实现它,成为一个
observer
对象。
原文链接: http://blog.csdn.net/sheismylife/article/details/1791360