今天这个模式,也是面试的时候问到的。其实这个模式最好理解。
观察者,与被观察的物体,订阅者,与被订阅(发布)者。
着这个模式下,我们实现了一对多的一个机制,并且可以针对对感兴趣的事情做订阅,或者观察,一旦有内容就自动通知。生活中这样的例子太多。在java中,也自带这个模式。我们还是先看看这个模式的UML:
[img]http://dl.iteye.com/upload/attachment/0065/5746/ed702ed9-38ac-3258-89f6-2d7d2ed8d21a.gif[/img]
一个订阅,一个发布,实际上很清晰明了。现在举个例子吧。天气预报吧。
每天都有气象局发布天气预报,而我们总不能天天打电话问吧,那就好好订阅一个天气服务吧,他会自动给你报。
首先,定义一个可被观察的对象。Oberservable,天气是可以被观察的吧。
这个类名字长了点。不过方便我们读懂。呵呵。这个接口,提供给可以被订阅的天气。
现在实现一个可以报告温度的天气吧。
非常的清晰。根据接口,我们的实现也非常简洁。在设置温度的时候,如果温度发生了改变,将通知所有注册的观察者。
现在我们来看看观察者:
一个观察者,需要提供一个接口,让被观察者调用。实现更新。
现在我们有个数据模型,需要根据温度改变而改变他的数据。
这里加入一个name,以便区分不同的订阅者。测试一下:
结果:
lily update temprature to : 20.0
lucy update temprature to : 20.0
lily update temprature to : 22.3
lucy update temprature to : 22.3
每一个观察者都得到了及时更新数据。
在这个模式下,更新与否,以及更新的频率都交由被观察的对象决定。
观察者,与被观察的物体,订阅者,与被订阅(发布)者。
着这个模式下,我们实现了一对多的一个机制,并且可以针对对感兴趣的事情做订阅,或者观察,一旦有内容就自动通知。生活中这样的例子太多。在java中,也自带这个模式。我们还是先看看这个模式的UML:
[img]http://dl.iteye.com/upload/attachment/0065/5746/ed702ed9-38ac-3258-89f6-2d7d2ed8d21a.gif[/img]
一个订阅,一个发布,实际上很清晰明了。现在举个例子吧。天气预报吧。
每天都有气象局发布天气预报,而我们总不能天天打电话问吧,那就好好订阅一个天气服务吧,他会自动给你报。
首先,定义一个可被观察的对象。Oberservable,天气是可以被观察的吧。
public interface WeatherServiceInterface {
public void subscribeWeatherService(Observer obs);
public void unsubscribeWeatherService(Observer obs);
public void notifyObserver(Object obj);
}
这个类名字长了点。不过方便我们读懂。呵呵。这个接口,提供给可以被订阅的天气。
现在实现一个可以报告温度的天气吧。
public class WeatherServiceImpl implements WeatherServiceInterface {
public List<Observer> observers;
public float temprature;
public float getTemprature() {
return temprature;
}
public void setTemprature(float temprature) {
if(this.temprature != temprature){
this.temprature = temprature;
this.notifyObserver(this);
}
}
public WeatherServiceImpl(){
this.observers = new ArrayList<Observer>();
}
@Override
public void subscribeWeatherService(Observer obs) {
// TODO Auto-generated method stub
observers.add(obs);
}
@Override
public void unsubscribeWeatherService(Observer obs) {
// TODO Auto-generated method stub
observers.remove(obs);
}
@Override
public void notifyObserver(Object obj) {
// TODO Auto-generated method stub
for(Observer obs:observers){
obs.update(obj);
}
}
}
非常的清晰。根据接口,我们的实现也非常简洁。在设置温度的时候,如果温度发生了改变,将通知所有注册的观察者。
现在我们来看看观察者:
public interface Observer {
public void update(Object obj);
}
一个观察者,需要提供一个接口,让被观察者调用。实现更新。
现在我们有个数据模型,需要根据温度改变而改变他的数据。
public class WeatherModel implements Observer{
public String name;
public float temprature;
public WeatherModel(String name){
this.name = name;
}
@Override
public void update(Object obj) {
// TODO Auto-generated method stub
temprature =((WeatherServiceImpl)obj).getTemprature();
System.out.println(name + " update temprature to : "+ temprature);
}
}
这里加入一个name,以便区分不同的订阅者。测试一下:
public class Test {
public static void main(String [] args){
WeatherServiceImpl wsi = new WeatherServiceImpl();
Observer obs1 = new WeatherModel("lily");
Observer obs2 = new WeatherModel("lucy");
wsi.subscribeWeatherService(obs1);
wsi.subscribeWeatherService(obs2);
wsi.setTemprature(20F);
try{
Thread.sleep(2);
}catch(InterruptedException e){}
wsi.setTemprature(22.30F);
}
}
结果:
lily update temprature to : 20.0
lucy update temprature to : 20.0
lily update temprature to : 22.3
lucy update temprature to : 22.3
每一个观察者都得到了及时更新数据。
在这个模式下,更新与否,以及更新的频率都交由被观察的对象决定。