Observable中有两个重载的方法,一个是不带参数的notifyObservers(),一个是带参数的notifyObservers(Object arg)
先说那个带参数的notifyObservers(Object arg):
这个参数Object arg 其实就是 Observer接口中的update(Observable o, Object arg)方法中的第二个参数
其实就是一个数据对象,也就是通知观察者,改变的数据对象是什么
这就是一种PUSH的方法,由主题主动的PUSH需要改变的数据对象给观察者
例子:
1
2
3
4
5
6
7
8
9
10
|
public
class
WeatherData
extends
Observable {
private
float
temperature;
private
float
humidity;
private
float
pressure;
……..
public
void
measurementsChanged() {
setChanged();
notifyObservers(
float
temperature);
}}
|
1
2
3
4
5
6
7
8
9
10
11
12
|
public
class
CurrentDisplay
extends
Observer {
private
float
temperature;
private
float
humidity;
private
float
pressure;
……..
public
void
update(Observable obs,Object arg) {
if
(arg
instanceof
Float){
temperature = ((Float)arg).floatValue();
}
}
|
而第二种不带参数的notifyObservers(),当调用它的时候, 传递一个null的数据对象给观察者.
其实也就是说,观察者需要改变什么数据,是需要观察者自己到主题那里去pull.
也就是说,通知你主题发生了变化,但是具体需要什么变化的数据,由你自己决定.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
class
WeatherData
extends
Observable {
private
float
temperature;
private
float
humidity;
private
float
pressure;
……..
public
void
measurementsChanged() {
setChanged();
notifyObservers();
}
public
float
getTemperature(){
Return temperature;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
class
CurrentDisplay
extends
Observer {
private
float
temperature;
private
float
humidity;
private
float
pressure;
……..
public
void
update(Observable obs,Object arg) {
if
(obs
instanceof
WeatherData){
WeatherData weatherData = (WeatherData)obs;
This.temperature = weatherData.getTemperature();
}
}
|
其实最大的区别就是一个是主动push,一个是被动pull