观察者模式
来源:互联网 发布:三国志9需要优化哪些 编辑:程序博客网 时间:2024/06/05 11:59
1.定义
观察者模式在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖他的对象都会收到通知,并自动更新。
2. 案例分析
假设现有以气象系统,我们所需要完成的是当气象站数据更新时,同步更新我们的布告板(即显示装置)。
我们的需要利用WeatherData对象取得数据,并更新三个布告板:目前状况,气象统计,天气预报。
下面我们用类图定义观察者模式
3. 实现气象站
Subject接口类
package sxd.learn.dp;public interface Subject{ public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers();}
Observer接口类
package sxd.learn.dp;public interface Observer{ public void update(float temp, float humidity, float pressure);}
DisplayElement接口类
package sxd.learn.dp;public interface DisplayElement{ public void display();}
用观察者模式实现WeatherData类
package sxd.learn.dp;import java.util.ArrayList;public class WeatherData implements Subject{ private ArrayList<Observer> observers; private float temperture; private float humidity; private float pressure; public WeatherData(){ observers = new ArrayList<Observer>(); } public void registerObserver(Observer o){ observers.add(o); } public void removeObserver(Observer o){ int i = observers.indexOf(o); if(i > 0){ observers.remove(i); } } public void notifyObservers(){ for (int i = 0; i < observers.size() ; i++) { Observer observer = (Observer) observers.get(i); observer.update(temperture, humidity , pressure); } } public void measurementsChanged(){ notifyObservers(); } public void setMeasurements(float temperture, float humidity, float pressure){ this.temperture = temperture; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); }}
布告板类CurrentConditionsDisplay
package sxd.learn.dp;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() { // TODO Auto-generated method stub System.out.println("Current conditions:" + temperature + "F degrees and " + humidity + "% humidity"); } @Override public void update(float temp, float humidity, float pressure) { // TODO Auto-generated method stub this.temperature = temp; this.humidity = humidity; display(); }}
测试程序类
package sxd.learn.dp;public class WeatherStation { public static void main(String[] args){ WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);// StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);// ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData); weatherData.setMeasurements(80, 65, 30.4f); weatherData.setMeasurements(82, 70, 30.3f); weatherData.setMeasurements(78, 90, 29.2f); }}
0 0
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- leetcode:Partition List
- Linear models for regresion(回归)
- 同一时间内相同程序只运行一个进程运行
- UDP可靠传输,VTCP和UDX协议比较
- 判断点是否在视景体内的参考资料
- 观察者模式
- apache中虚拟目录总是403 Forbidden的问题
- 虚拟浏览器(WebClient)应用简单例子
- LibSVM-3.20在Matlab2014a中的使用(VS2013)
- 寻找第K大数字问题
- 复制到剪贴板的js代码(兼容ie、firefox、chorme、safari...什么都兼容!)
- leetcode:Permutations
- 理解二分查找!!! 九度OJ-1534,数组中第K小的数字。
- 多线程,互斥锁