你的位置:首页 > 软件开发 > ASP.net > 第二章 观察者模式

第二章 观察者模式

发布时间:2015-12-03 00:00:04
现在我们要做一个天气应用程序,可以显示当前的天气状况。你需要从气象台获取数据,然后显示在公告板上。气象台的数据随时都有可能变化,你的公告板也需要同步变化。 我们可以让公告板每隔一段时间查询一次天气数据。为了不错过重要数据,这个时间间隔要小一些(也许每隔一秒)。同时又为了节约资源 ...

现在我们要做一个天气应用程序,可以显示当前的天气状况。你需要从气象台获取数据,然后显示在公告板上。气象台的数据随时都有可能变化,你的公告板也需要同步变化。

第二章 观察者模式

我们可以让公告板每隔一段时间查询一次天气数据。为了不错过重要数据,这个时间间隔要小一些(也许每隔一秒)。同时又为了节约资源,这个时间间隔又要设大一些(也许每小时一次)。这样就很矛盾。本质问题在于你不能预测什么时候有新数据产生。

这就好像你忙着工作不能经常查阅自己的电子邮箱。然而不经常查阅邮箱可能会错过很多重要的邮件。怎么办呢?如果有新邮件到来都会提醒我就好了!对,这就是观察者模式。

谈到观察者模式前,我们要约定一个术语:主题(subject)。观察者对主题很感兴趣,希望主题有变动后都会收到提醒。主题发生变化后会主动提醒所有关注它的观察者,而不关心观察者收到最新的数据后会做些什么。

用观察者模式来设计我们的天气应用

WeatherData是主题(Subject),CurrentConditionsDisplay(天气公告板)是观察者(Observer)。

主题能够注册、注销观察者,当数据发生变化时还要通知所有已经注册的观察者。

观察者主要等着主题来通知自己就好(等主题调用自己的update方法)。

第二章 观察者模式

主题代码

public interface Subject {  public void registerObserver(Observer observer);  public void removeObserver(Observer observer);  public void notifyObservers();}public class WeatherData implements Subject {  private float temperature;//温度  private float humidity;//湿度  private float pressure;//压力  private ArrayList<Observer> observers;    public WeatherData() {    observers = new ArrayList<>();  }  @Override  public void registerObserver(Observer observer) {    observers.add(observer);  }  @Override  public void removeObserver(Observer observer) {    observers.remove(observer);  }  @Override  public void notifyObservers() {    for (Observer observer : observers) {      observer.update(temperature, humidity, pressure);    }  }    //在合适的时候通知所有观察者  public void measurementsChanged() {    notifyObservers();  }    //数据发送变化,这时候需要通知所有观察者  public void setMeasurements(float temperature, float humidity, float pressure) {    this.temperature = temperature;    this.humidity = humidity;    this.pressure = pressure;    measurementsChanged();  }}

原标题:第二章 观察者模式

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录