简单理解观察者模式(Observer)
程序员文章站
2022-07-12 20:37:22
...
简单理解观察者模式 /** * 主题(被观察者信息) */ 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); } }
上一篇: JAVA Observer