观察者模式是对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化。
首先看下观察者模式的模型图:
观察者模式定义了四种角色:抽象主题、具体主题、抽象观察者、具体观察者。
- 抽象主题(Subject):该角色是一个抽象类或接口,定义了增加、删除、通知观察者对象的方法。
- 具体主题(ConcreteSubject):该角色继承或实现了抽象主题,定义了一个集合存入注册过的具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
- 抽象观察者(Observer):该角色是具体观察者的抽象类,定义了一个更新方法。
- 具体观察者(ConcrereObserver):该角色是具体的观察者对象,在得到具体主题更改通知时更新自身的状态。
代码实现:
抽象主题接口:
这里使用java内置的Observerable类
具体主题(这里使用java内置的观察者接口Observable ):
package com.tian.observer;
import java.util.Observable;
public class WeatherData extends Observable {
public void dataChange(float mTemperatrue, float mPressure, float mHumidity) {
this.setChanged();
this.notifyObservers(new Data(mTemperatrue, mPressure, mHumidity));
}
public void setData(float mTemperatrue, float mPressure, float mHumidity) {
dataChange(mTemperatrue, mPressure, mHumidity);
}
}
抽象观察者:
这里使用java内置的Observer接口
具体观察者:
package com.tian.observer;
import java.util.Observable;
import java.util.Observer;
public class ForcastConditions implements Observer {
private float mTemperatrue;
private float mPressure;
private float mHumidity;
@Override
public void update(Observable arg0, Object arg1) {
this.mTemperatrue=((Data)(arg1)).mTemperatrue;
this.mPressure=((Data)(arg1)).mPressure;
this.mHumidity=((Data)(arg1)).mHumidity;
display();
}
public void display()
{
System.out.println("***Tomorrow mTemperatrue:" +(mTemperatrue+1)+"***");
System.out.println("***Tomorrow mPressure:" +(mPressure+1)+"***");
System.out.println("***Tomorrow mHumidity:" +(mHumidity+1)+"***");
}
}
Data实体类:
package com.tian.observer;
public class Data {
public float mTemperatrue;
public float mPressure;
public float mHumidity;
public Data(float mTemperatrue, float mPressure, float mHumidity) {
this.mTemperatrue = mTemperatrue;
this.mPressure = mPressure;
this.mHumidity = mHumidity;
}
}
测试类:
package com.tian.observer;
public class InternetWeather {
public static void main(String[] args) {
// 新建具体的观察者
ForcastConditions mForcastConditions = new ForcastConditions();
// 新建具体主题
WeatherData mWeatherData = new WeatherData();
// 增加观察者
mWeatherData.addObserver(mForcastConditions);
// 放入数据
mWeatherData.setData(30, 150, 40);
// 删除观察者
mWeatherData.deleteObserver(mForcastConditions);
mWeatherData.setData(35, 150, 60);
}
}