讲稿hf2观察者模式_第1页
讲稿hf2观察者模式_第2页
讲稿hf2观察者模式_第3页
讲稿hf2观察者模式_第4页
讲稿hf2观察者模式_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1观察者模式2观察者模式气象监控应用系统概观系统有三个部分:气象站 获取实际气象数据的物理设备气象数据对象 跟踪气象站的数据,并更新布告板布告板 向用户显示当前的目前状况(温度、湿度、气压)或气象统计或天气预报3Weather对象知道如何跟物理气象站联系,取得新的数据。我们的工作是建立一个应用,利用Weather对象的数据,更新三个布告板。4有三个布告板,将来可能需要增加新的布告板。5气象站送来的数据类(WeatherData)我们的工作是实现measurementsChanged(),好让它更新目前状况、气象统计和天气预报的显示布告板。不在乎此方法是如何调用的,只在乎它被调用了。6一个可能的

2、实现public class WeatherData / 实例变量声明 public void measurementsChanged() float temp = getTemperature();float humidity = getHumidity();float pressure = getPressure();currentConditionsDisplay.update(temp, humidity, pressure);statisticsDisplay.update(temp, humidity, pressure);forecastDisplay.update(temp,

3、humidity, pressure); / 其它WeatherData方法取得最近的测量值。更新布告板。传入最新的测量值,调用布告板的更新显 示。7我们的实现的缺陷在哪里? 针对具体的实现编码。如果不修改程序,我们就无法增加或删除其它显示成分。 currentConditionsDisplay.update(temp, humidity, pressure); statisticsDisplay.update(temp, humidity, pressure); forecastDisplay.update(temp, humidity, pressure);针对具体实现编程,导致增加或删除

4、布告板时,必须修改程序。8会会观察者模式9101112131415观察者模式也称为发布-订阅模式 报社的业务就是出版报纸 向某家报社订阅报纸,只要他们有新报纸出版,就会给 你送来。只要你是他们的用户,你就会一直收到新报纸 当你不想再看报纸的时候,取消订阅,他们就不会再送 新报纸 只要报社还在运营,就会一直有人(或单位)向他们订 阅报纸或取消订阅报纸16观察者模式定义17观察者模式类图实现观察者模式的一种方法。18松耦合的威力 当两个对象是松耦合的,它们彼此之间能够交互,但是相互了解很少。 观察者模式提供了主题和观察者之间的松耦合设计。因为主题只知道观察者实现了某个接口(即Observer接口)

5、,主题不需要知道具体观察者是谁、作了些什么或其它任何细节。要增加新的观察者或删除观察者,主题不会受到任何影响,不必修改主题代码。 可以独立地复用主题和观察者,它们之间互不影响,即是松耦合的。19松耦合的威力(续) 由于松耦合设计使得对象间的依赖最小化,所以,我们能够创建柔性的OO系统,应对变化的情况,因为对象之间的依赖降到了最低。20设计气象站右边三个布告板也应该有一个“主题”指针指向WeatherData对象,本图未画出来。21实现气象站public interface Subject public void registerObserver(Observer o);public void

6、removeObserver(Observer o);public void notifyObservers();public interface Observer public void update(float temp, float humidity, float pressure);public interface DisplayElement public void display();需要观察者作为参数。22实现气象数据的Subject接口public class WeatherData implements Subject private ArrayList observers;

7、private float temperature;private float humidity;private float pressure;public WeatherData() observers = new ArrayList();ArrayList记录观察者。23 public void registerObserver(Observer o) observers.add(o); public void removeObserver(Observer o) int i = observers.indexOf(o);if (i = 0) observers.remove(i); pu

8、blic void notifyObservers() for (int i = 0; i observers.size(); i+) Observer observer = (Observer)observers.get(i); observer.update(temperature, humidity, pressure); 24public void measurementsChanged() notifyObservers();public void setMeasurements(float temperature, float humidity, float pressure) t

9、his.temperature = temperature;this.humidity = humidity;this.pressure = pressure;measurementsChanged();/ other WeatherData methods here25实现显示public class CurrentConditionsDisplay implements Observer, DisplayElement private float temperature; private float humidity; private Subject weatherData; public

10、 CurrentConditionsDisplay(Subject weatherData) this.weatherData = weatherData;weatherData.registerObserver(this); public void update(float temperature, float humidity, float pressure) this.temperature = temperature;this.humidity = humidity;display(); public void display() System.out.println(Current

11、conditions: + temperature + F degrees and + humidity + % humidity); weatherData供注册或取消注册之用。另外两个布告板的实现非常类似。26为气象站提供动力 public class WeatherStation public static void main(String args) WeatherData weatherData = new WeatherData();CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weat

12、herData);StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);weatherData.setMeasurements(80, 65, 30.4f);weatherData.setMeasurements(82, 70, 29.2f);weatherData.setMeasurements(78, 90, 29.2f); 模拟新的气象测量。27运行程序28Java

13、内置的观察者模式 java.util包(package)内包含了最基本的Observable类与 Observer接口,这与我们subject接口和Observer接口很 相似。 Java GUI。例如,JButton可以增加或删除倾听者 (listener),例如,ActionListener能倾听在按钮上发生的 动作。这些倾听者就是观察者。 JavaBeans。29实例代码分析public class Secretary /前台秘书类 private ArrayList observers; / 同事列表 private string action; public Secretary ()

14、 observers = new ArrayList(); public void attach(StockObserver observer) / 增加 observers.add(observer) public void notify() / 通知 for (int i=0; iobservers.size(); i+) StockObserver observer = (StockObserver) observers.get(i) observer. update(); public void secretaryAction(string action) / 发生新的事件 this.action = action; notify( ); 30public class StockObserver / 看股票同事类 private string name; private Secretary sub; public StockObserver(string name, Secretary sub) = name; this.sub = sub; sub.attach(name); public void update( ) System.out.println(“关闭股票,继续工作!); public class clien

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论