设计模式-观察者模式(上)

设计模式-观察者模式(上)
 
本文参考Head First设计模式一书,感受书中的例子实在很好,很贴切。对模式的知识点进行总结,并对书的源码作了必定注释。
 
观察者模式要点有二:主题和观察者。
最贴切的案例是:杂志订阅,杂志是主题,观察者是订阅者。当出版新杂志时候,这个事件会自动通知全部的订阅者。
根据OO基本原则,应该针对接口编程(固然缘由不少),主题和订阅者通常都做为接口。
 
下面是Head First的例子,是一个气象站,用户订阅气象信息的服务。
 
而且,最终用户所要的信息多是:
 
针对这个需求,应用观察者模式来实现:
可是这个只是一个主题与观察者的设计,观察者自身还须要将信息显示出去。那么再用一个接口,专门来实现展现的功能。
 
 
实际上,上面的DisplayElement接口用再此处,本质上是策略模式的应用。
 
理解每一个模式的特色对交流和设计都有很大帮助,当OO思想境修炼到很高的程度时,应该是忘掉全部的模式,而能够根据须要作出最佳设计,这个程度能够算手中无剑,心中有剑的地步。
 
下面是源码,只列出接口:
/**
* 主题
*/

public interface Subject {
   public void registerObserver(Observer o);
   public void removeObserver(Observer o);
   public void notifyObservers();
}
 
/**
* 观察者
*/

public interface Observer {
   public void update( float temp, float humidity, float pressure);
}
 
/**
* 布告板
*/

public interface DisplayElement {
   public void display();
}
 
测试main方法:
   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);
    HeatIndexDisplay heatIndexDisplay = new HeatIndexDisplay(weatherData);
                 //进行气象测量,主题的状态会由于测量值而改变
    weatherData.setMeasurements(80, 65, 30.4f);
    weatherData.setMeasurements(82, 70, 29.2f);
    weatherData.setMeasurements(78, 90, 29.2f);
  }
 
本例仅仅是为了说明这种模式,设计还远不够完美。实际上,主题中应该有一个线程去扫描状态的变化,当变化了,自动去调用measurementsChanged()方法。
 
观察者模式使用很广泛,GUI编程中事件注册就是典型的观察者模式的应用。
 
以上是本身实现的观察者模式,下文将讲述JDK所实现的观察者模式。
相关文章
相关标签/搜索