设计模式-观察者模式(上)
2012-04-08 17:14
225 查看
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lavasoft.blog.51cto.com/62575/201617
设计模式-观察者模式(上)
本文参考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所实现的观察者模式。
本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/201617
设计模式-观察者模式(上)
本文参考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所实现的观察者模式。
本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/201617
相关文章推荐
- 设计模式之观察者模式(Observer)摘录
- GoF23种设计模式之行为型模式之观察者模式
- Java--设计模式之观察者模式
- 《Head First 设计模式》学习笔记——观察者模式 + 装饰者模式
- php设计模式之观察者模式
- PHP设计模式之观察者模式(Observer)详细介绍和代码实例
- 设计模式之——观察者模式
- 设计模式学习笔记观察者模式
- [设计模式]观察者模式1(用JDK提供的API)
- 设计模式学习笔记--Observer Pattern观察者模式
- 设计模式(九): 观察者模式
- 设计模式之观察者模式
- Java设计模式之——观察者模式
- 设计模式2:观察者(Observer)模式
- 设计模式学习笔记-观察者模式
- 设计模式之七 --- 观察者模式(Observer)
- PHP设计模式 观察者设计模式
- Javascript 设计模式学习之四 Observer(观察者)模式
- 设计模式之观察者模式-Observer
- 设计模式总结笔记<四> 观察者模式