观察者模式 定义了对象之间的一对多的依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新
利用观察者模式,主题是具有状态的对象,并且可以控制这些状态,也就是说,有一个具有状态的主题。另一方面,观察者使用了这些状态,虽然这些状态并不属于他们。有许多的观察者,依赖主题来告诉他们状态何时改变,这就产生了一个关系, 一个主题对多个观察者的关系。
使用java内置的观察者模式
主题,被观察者对象
package cn.test.design_pattern.observer;
import java.util.Observable;
/**
* 主题,被观察中 继承于java 内置的Observable
* @author acer
*
*/
public class WeatherData extends Observable{
private float temperature;
private float humidity;
private float pressure;
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
public WeatherData() {
}
public void measuermentsChanged(){
/**
* 在调用notifyObservers()之前,要先条用setChanged() 来指示状态已经改变
*/
this.setChanged();
notifyObservers();
}
public void setMeasurements(float temperature,float humidity,float pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measuermentsChanged();
}
}
观察者对象
package cn.test.design_pattern.observer;
import java.util.Observable;
import java.util.Observer;
/**
* 观察者对象,实现java 内置Observer 接口
* @author acer
*
*/
public class CurrentConditionsDisplay implements Observer, DisplayElement {
private float temperature;
private float humdity;
Observable observable;
public CurrentConditionsDisplay(Observable observable) {
/**
* 构造一个 主题(被观察者对象) 并指定当前对象为观察者
*/
this.observable = observable;
observable.addObserver(this);
}
@Override
public void display() {
System.out.println("Current conditions: " + temperature
+ "F degrees and " + humdity + "%humdity");
}
@Override
public void update(Observable o, Object arg) {
/**
* 在 update() 方法中先确定被观察者是否是当前观察者说观察的对象,然后取出被观察者中的数据
*/
if( o instanceof WeatherData){
WeatherData weatherData = (WeatherData) o;
this.humdity = weatherData.getHumidity();
this.temperature = weatherData.getTemperature();
display();
}
}
}
测试代码
package cn.test.design_pattern.observer;
public class WeatherStation {
/**
* @param args
*/
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay display = new CurrentConditionsDisplay(weatherData);
weatherData.setMeasurements(80, 120.0f, 4f);
weatherData.setMeasurements(81, 120.0f, 4f);
weatherData.setMeasurements(82, 120.0f, 4f);
}
}
总结:
1.观察者模式定义了对象之间一对多的关系。
2.主题(被观察者) 用一个共同的接口来更新观察者。
3.观察者和被观察者之间使用松耦合方式结合,被观察者不知道观察者的细节,只知道观察者实现了观察者接口。