【HeadFirst 设计模式】观察者模式
2014-01-03 00:02
316 查看
观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
观察者模式的类图:
设计原则:为了交互对象之间的松耦合设计而努力。
观察者模式提供了一种对象设计,让主题和观察者之间松耦合。主题只知道观察者实现了某个接口(Observer接口)。主题不需要知道观察者的具体类是谁、做了些什么或其它任何细节。
松耦合的设计之所以能让我们建立有弹性的OO系统,能够应付变化,是因为对象之间的互相依赖降到了最低。
当两个对象之间松耦合,它们依然可以交互,但是不清楚彼此的细节。
Java内置的观察者模式
java.util包内包含最基本的Observer接口和Observable类。
类图:
示例:建立一个应用,利用WeatherData对象取得数据(temperature, humidity, pressure),并更新三个布告板:StatisticsDisplay, ForecastDisplay, ThirdPartyDisplay。
WeatherData.java
CurrentConditionsDisplay.java
DisplayElement.java
观察者模式的类图:
设计原则:为了交互对象之间的松耦合设计而努力。
观察者模式提供了一种对象设计,让主题和观察者之间松耦合。主题只知道观察者实现了某个接口(Observer接口)。主题不需要知道观察者的具体类是谁、做了些什么或其它任何细节。
松耦合的设计之所以能让我们建立有弹性的OO系统,能够应付变化,是因为对象之间的互相依赖降到了最低。
当两个对象之间松耦合,它们依然可以交互,但是不清楚彼此的细节。
Java内置的观察者模式
java.util包内包含最基本的Observer接口和Observable类。
类图:
示例:建立一个应用,利用WeatherData对象取得数据(temperature, humidity, pressure),并更新三个布告板:StatisticsDisplay, ForecastDisplay, ThirdPartyDisplay。
WeatherData.java
import java.util.Observable; import java.util.Observer; public class WeatherData extends Observable { private float temperature; private float humidity; private float pressure; public WeatherData() { } public void measurementsChanged() { setChanged(); //在调用notifyObservers之前,要先调用setChanged()来指示状态已经改变 notifyObservers(); } public void setMeasurements(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); } public float getTemperature() { return temperature; } public float getHumidity() { return humidity; } public float getPressure() { return pressure; } }
CurrentConditionsDisplay.java
import java.util.Observable; import java.util.Observer; public class CurrentConditionsDisplay implements Observer, DisplayElement { Observable observable; private float temperature; private float humidity; public CurrentConditionsDisplay(Observable observable) { this.observable = observable; observable.addObserver(this); } //增加Observable和数据对象作为参数 public void update(Observable obs, Object arg) { //确定可观察者属于WeatherData类型 if (obs instanceof WeatherData) { WeatherData weatherData = (WeatherData)obs; this.temperature = weatherData.getTemperature(); this.humidity = weatherData.getHumidity(); display(); } } public void display() { System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity"); } }
DisplayElement.java
public interface DisplayElement { public void display(); }
相关文章推荐
- HeadFirst 设计模式-观察者模式
- 【HeadFirst 设计模式总结】2 观察者模式
- HeadFirst 设计模式 2观察者模式 (气象站实现)
- 《HeadFirst 设计模式》之观察者模式
- HeadFirst 设计模式学习笔记2--观察者模式
- 【HeadFirst 设计模式学习笔记】2 观察者模式
- HeadFirst 设计模式学习笔记2--观察者模式
- HeadFirst 设计模式学习笔记2--观察者模式
- java设计模式(六)--观察者模式
- 设计模式—观察者模式
- Observer观察者设计模式
- 详解Python设计模式编程中观察者模式与策略模式的运用
- 设计模式学习笔记-观察者模式(Observer)
- Java设计模式(八)观察者模式 迭代器模式
- 详解Python设计模式编程中观察者模式与策略模式的运用
- cocos2d-x设计模式发掘之六:观察者模式
- 设计模式之观察者模式
- 观察者设计模式
- 设计模式之观察者模式-笔记
- 设计模式--观察者模式(五)