什么是观察者模式:
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
条件:
1.观察者模式定义了一系列对象之间的一对多关系
2.当一个对象改变状态,其它依赖者都会收到通知
例子: 实现气象站--气象站发布最新的温度,湿度,气压; 订阅者可以及时看到最新的数据;并且实现订阅者的动态新增和删除
主题接口:
public interface Subject { public void registerObserver(Observer observer); public void removeObserver(Observer observer); public void notifyObservers(); }
观察者接口:
public interface Observer { public void update(float temp,float humidity,float pressure); }
布告板接口:
public interface DisplayElement { public void display(); }
WeatherData实现主题接口:
public class WeatherData implements Subject{ private ArrayList observers; private float temperature; private float humidity; private float pressure; public WeatherData() { observers = new ArrayList(); } @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { int i = observers.indexOf(observer); if (i >= 0) { observers.remove(i); } } @Override public void notifyObservers() { for(int i=0; i<observers.size(); i++) { Observer observer = (Observer) observers.get(i); observer.update(temperature,humidity,pressure); } } public void measurementsChanged() { notifyObservers(); } public void setMeasuremets(float temperature,float humidity,float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); } public ArrayList getObservers() { return observers; } public void setObservers(ArrayList observers) { this.observers = observers; } public float getTemperature() { return temperature; } public void setTemperature(float temperature) { this.temperature = temperature; } public float getHumidity() { return humidity; } public void setHumidity(float humidity) { this.humidity = humidity; } public float getPressure() { return pressure; } public void setPressure(float pressure) { this.pressure = pressure; } }
建立布告板:
public class CurrentConditionsDisplay implements Observer,DisplayElement { private float temperature; private float humidity; private Subject weatherData; public CurrentConditionsDisplay(Subject weatherData) { this.weatherData = weatherData; weatherData.registerObserver(this); } @Override public void display() { System.out.println("Current Temperature:" + temperature); System.out.println("Current Humidity:" + humidity); } @Override public void update(float temp, float humidity, float pressure) { this.temperature = temp; this.humidity = humidity; display(); } }
测试类
public class WeatherStation { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData); weatherData.setMeasuremets(80,70,30.4f); } }
运行结果:
Current Temperature:80.0
Current Humidity:70.0