观察者模式
一、定义
对象之间定义一对多的依赖,当一个对象状态改变,依赖它的对象都会收到通知并作出相应的更新。
二、应用场景
典型的就是杂志的订阅,rss订阅。我们订阅的一方就形成了对杂志社的依赖,只要杂志社有更新,而我们就对得到相应的通知
三、涉及的概念
主题Subject(杂志社)
观察者Observer(我们订阅的一方)
四、接口的定义
对于杂志社(Subject)而言:
1、可以添加一个订阅的人(Observer);registerObserver(Observer observer);
2、如果不想订阅了,那杂志社可以吧相应订阅的人从名单上移除,那以后有新的杂志出来,不会再发送给那个人了;removeObserver(Observer observer)
3、有新的杂志出来,那就要通知每个订阅的人;notifyObservers();
对应的java类如下
/** * @ClassName 类 名 称: Subject.java * @Description 功能描述: 主题 * @author 创 建 者: zhengQun * @date 创建日期: 2013-11-21下午2:16:09 */ public interface Subject { public void registerObserver(Observer observer); public void removeObserver(Observer observer); public void notifyObservers(); }
对于我们订阅的一方(观察者):对于杂志的到来,我们可能会进行阅读,也有可能做收藏用。。。总的来说就是我们如何来应对主题的更新。对应的java类如下:
/** * @ClassName 类 名 称: Observer.java * @Description 功能描述: * @author 创 建 者: zhengQun * @date 创建日期: 2013-11-21下午2:27:30 */ public interface Observer { public void update(float temperature,float humidity,float pressure); }
五、具体的应用:
如果气象站温度、湿度、压力改变了,需要在对应的布告板上显示出来
/** * @ClassName 类 名 称: WeatherData.java * @Description 功能描述: * @author 创 建 者: zhengQun * @date 创建日期: 2013-11-21下午2:29:12 */ public class WeatherData implements Subject{ private List<Observer> observerList; private float temperature; private float humidity; private float pressure; public WeatherData() { observerList = new ArrayList<Observer>(); } public WeatherData(List<Observer> observerList) { this.observerList = observerList; } public void registerObserver(Observer observer) { observerList.add(observer); } public void removeObserver(Observer observer) { if(observerList.indexOf(observer) != -1){ observerList.remove(observer); } } public void notifyObservers() { for (Observer o : observerList) { o.update(temperature, humidity, pressure); } } public void mesurementsChanged(){ notifyObservers(); } public void setMesurements(float temperature,float humidity,float pressure){ this.setTemperature(temperature); this.setHumidity(humidity); this.setPressure(pressure); mesurementsChanged(); } 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; } }
布告板:
/** * @ClassName 类 名 称: CurrentConditionDisplay.java * @Description 功能描述: * @author 创 建 者: zhengQun * @date 创建日期: 2013-11-21下午2:51:46 */ public class CurrentConditionDisplay implements Observer,DisplayBehavior{ private float temperature; private float humidity; private Subject weatherData; public CurrentConditionDisplay() { } public CurrentConditionDisplay(Subject weatherData) { this.weatherData = weatherData; weatherData.registerObserver(this); } public void display() { System.out.println("当前的状况:" + temperature + "℃," + humidity + "%湿度"); } public void update(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; display(); } }
测试类:
/** * @ClassName 类 名 称: Test.java * @Description 功能描述: * @author 创 建 者: zhengQun * @date 创建日期: 2013-11-21下午3:06:18 */ public class Test { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionDisplay display = new CurrentConditionDisplay(weatherData); weatherData.setMesurements(12, 60, 14); } }