简单理解观察者模式
/**
* 主题(被观察者信息)
*/
public interface Subject {
/**
* 注册观察此对象
*/
boolean registerObserver(Observer observer);
/**
* 删除此对象
*/
boolean removeObserver(Observer observer);
/**
* 通知变化
* 当主题状态改变时, 这个方法会被调用,以通知所有的观察者。
*/
int notifyObservers();
}
/**
* 观察者接口
*/
public interface Observer {
/**
* 更新数据
* 所有的观察者都必须实现update()方法,以实现观察者接口。在这里,我们按照Mary和Sue的想法把观测值传入观察者中
* @return
*/
boolean update(double temp,double humidity,double pressure);
}
/**
* 不同的显示
*/
public interface DisplayElement {
void display();
}
/**
* 主题对象类
*/
public class WeatherData implements Subject {
private List<Observer> observers = new ArrayList<Observer>();
private double temperature;
private double humidity;
private double pressure;
public WeatherData() {
}
@Override
public boolean registerObserver(Observer observer) {
return observers.add(observer);
}
@Override
public boolean removeObserver(Observer observer) {
if(observers != null || observers.isEmpty()){
throw new RuntimeException("注册列表为空");
}
return observers.remove(observer);
}
@Override
public int notifyObservers() {
if(observers == null || observers.isEmpty()){
return 0;
}
int result = 0;
for (int i = 0,size=observers.size(); i < size; i++) {
Observer o = observers.get(i);
o.update(temperature, humidity, pressure);
result++;
}
return result;
}
/**
* 主题发生变化,通知观察者
*/
public void measurementsChanged() {
notifyObservers();
}
/**
* 改变主题
*/
public void setMeasurements(double temperature, double humidity, double pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
}
/**
* 观察者对象类
*/
public class CurrentConditionsDisplay implements Observer,DisplayElement {
private double temperature;
private double humidity;
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
@Override
public boolean update(double temp, double humidity, double pressure) {
this.temperature = temp;
this.humidity = humidity;
display();
return true;
}
@Override
public void display() {
System.out.println("Current conditions: " + temperature
+ "F degrees and " + humidity + "% humidity");
}
}
/**
* 数据源
*/
public class WeatherStation {
public static void main(String[] args) {
WeatherData wd = new WeatherData();
CurrentConditionsDisplay ccd = new CurrentConditionsDisplay(wd);
wd.setMeasurements(80, 60, 30);
wd.setMeasurements(81, 61, 31);
wd.setMeasurements(82, 62, 32);
}
}