一、定义
一种一对多的依赖关系,让多个观察者对想同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察这对象,是它们能够自动更新自己。
二、例子。
气象台对天气实时监控,只要天气的温度湿度等等一有变化就公告栏就更新数据。
UML图:
代码:
天气变化接口:
public interface Subject(){
public void registerObserver(Observer o);//添加公告栏
public void removeObserver(Observer o);//取消公告栏
public void notifyObservers();//通知公告栏更新
}
天气变化数据改变实现:
public class WeatherData implements Subject{
private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;
//公告栏的模版
public WeatherData(){
observers= new ArrayList();
}
//添加公告栏
public void registerOvserver(Observer o ){
observers.add(o);
}
//移除公告栏
public void removeObserver(Observer o){
int i=observers.indexOf(o);
if(i>=0){
observers.remove(i);
}
}
//通知公告栏更新的信息
public notifyObservers(){
for(int i=0;i<observers.size();i++){
Observer observer=(Observer)observer.get(i);
observer.update(temperature,humidity,pressure);
}
}
//公告栏更新
public void measurementsChanged(){
notifyObservers();
}
//获得信息
public void setMeasurements(float temperature,float humidity,float pressure){
this.temperature=temperature;
this.humidity=humidity;
this.pressure=pressure;
measurementsChanged();
}
}
公告栏更新接口:
public interface Observer(){
public void update(float temp,float humidity,float pressure);
}
公告栏显示接口:
public interface DisplayElement(){
public void display();
}
公告栏:
public class CurrentConditionsDisplay implements Observer,DisplayElements{
private float temperature;
private float humidity;
private Subject weatherData;
//公告栏构造函数
public CurrentConditionsDisplay(Subject weatherData){
this.weatherData=weatherData;
weatherData.registerOvserver(this);
}
//公告栏更新数据
public void update(float temperature,float humidity,float,float pressure){
this.temperature=temperature;
this.humidity=humidity;
display();
}
public void display(){
System.out.println("Current conditions:"+ temperature+"F degress and "+humidity+"% humidity");
}
}
客户端:
public class WeatherStation{
public static void main(String[] args){
WeatherData wetherData=new WeaterData();
CurrentConditionsDisplay currentDisplay(weaterData);
weaterData.setMeasurements(80,65,30.4f);
}
}
综述:
观察者模式让双方都依赖于接口(或抽象),而不是依赖与具体,从而是的各自的变化都不会影响另一边的变化。公告板样式,显示数据的变化不会影响天气数据的变化。