观察者模式:在对象之间定义一对多的依赖,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。
在定义一对多的时候,我们把一称做主题,多称做观察者。下面我们直接看代码来简单了解观察者模式。
第一步:先创建一个主题接口,对象使用此接口来新增、删除、通知观察者。
//主题接口,用于添加、删除和通知观察者 public interface Subject { //添加观察者 public void registerObserver(Observer o); //删除观察者 public void removeObserver(Observer o); //通知所有观察者 public void notifyObservers(); }
第二步:创建一实现主题接口的实体类。其中temperature、humidity、pressure为主题通知给观察者的数据。
//实现主题接口 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 o) { observers.add(o); } @Override public void removeObserver(Observer o) { int i = observers.indexOf(o); if(i >= 0){ observers.remove(i); } } @Override public void notifyObservers() { for(int i =0; i<observers.size(); i++){ Observer o = (Observer)observers.get(i); o.update(temperature, humidity, pressure); } } public void measurementsChange(){ notifyObservers(); } public void setMeasurements(float temperature, float humidity,float pressure){ this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChange(); } }
第三步:创建一个观察者接口,并有一个update方法告诉观察者,当主题改变时调用。
//观察者的需实现的接口,表明是观察者身份 public interface Observer { public void update(float temperature, float humidity,float pressure); }
第四步:创建两个观察者,并实现观察者接口。
//创建一个观察者CurrentConditionsDisplay public class CurrentConditionsDisplay implements Observer{ private float temperature; private float humidity; private float pressure; private Subject weatherData; public CurrentConditionsDisplay(Subject weatherData){ this.weatherData = weatherData; //在主题中加入此观察者 weatherData.registerObserver(this); } @Override public void update(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; System.out.println("观察者CurrentConditionsDisplay得到了数据:" + temperature +"," + humidity +"," + pressure); } }
//创建另一个观察者StatisticsDisplay public class StatisticsDisplay implements Observer{ private float temperature; private float humidity; private float pressure; private Subject weatherData; public StatisticsDisplay(Subject weatherData){ this.weatherData = weatherData; //在主题中加入此观察者 weatherData.registerObserver(this); } @Override public void update(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; System.out.println("观察者StatisticsDisplay得到了数据:" + temperature +"," + humidity +"," + pressure); } }
第五步:测试
public class Test { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay conditionsDisplay = new CurrentConditionsDisplay(weatherData); StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData); weatherData.setMeasurements(1.0f,2.0f,3.0f); } }
运行结果:
好了,这就是一个简单的观察者模式了,其实在Java中,有内置的观察者模式,主要利用java.util.Observer和java.util.Observable,具体这里不讲解了,都很类似。
下一节:装饰者模式