观察者模式
- 普通的观察者设计模式,一对多的关系。一个主题对应多个对象,对象可以注册,移除,当主题有数据的改变的时候通知对象update。
1.主题接口
public interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObserver();
}
主题实现类
public class WeatherData implements Subject {
private ArrayList observerList;
private float temp;
private float humidity;
private float pressure;
public WeatherData() {
observerList = new ArrayList();
}
public void measureChanged() {
notifyObserver();
}
//设置数据
public void setChangedData(float temp, float humidity, float pressure) {
this.temp = temp;
this.humidity = humidity;
this.pressure = pressure;
measureChanged();
}
@Override
public void registerObserver(Observer o) {
observerList.add(o);
}
@Override
public void removeObserver(Observer o) {
int i = observerList.indexOf(o);
if (i>=0){
observerList.remove(i);
}
}
@Override
public void notifyObserver() {
for (int i=0;i<observerList.size();i++){
Observer observer = (Observer) observerList.get(i);
observer.update(temp,humidity,pressure);
}
}
}
当前状况观察者
public class CurrentConditionObserver implements Observer, DisPlayElement {
private Subject weatherData;
private float temp;
private float humidity;
private float pressure;
public CurrentConditionObserver(Subject weatherData) {
this.weatherData=weatherData;
weatherData.registerObserver(this);
}
@Override
public void display() {
System.out.println("当前天气状况:" + temp + ":" + humidity + ":" + pressure);
}
@Override
public void update(float temp, float humidity, float pressure) {
this.temp=temp;
this.humidity=humidity;
this.pressure=pressure;
display();
}
}
统计观察对象。
public class StatisticObserver implements Observer ,DisPlayElement{
@Override
public void display() {
}
@Override
public void update(float temp, float humidity, float pressure) {
}
}
天气预报观察者对象
public class WeatherCastObserver implements Observer ,DisPlayElement{
@Override
public void display() {
}
@Override
public void update(float temp, float humidity, float pressure) {
}
}
java内部API支持Observer,可以进行推数据,对象可以进行拉数据,这时候主题应该叫可观察者。
Observerable ,Observer是java,util包里面的。
public class WeatherData extends Observable {
private float temp;
private float humidity;
private float pressure;
public WeatherData() {
}
public void measureChanged() {
setChanged();
notifyObservers();
}
//设置数据
public void setChangedData(float temp, float humidity, float pressure) {
this.temp = temp;
this.humidity = humidity;
this.pressure = pressure;
measureChanged();
}
public float getTempData() {
return temp;
}
public float getHumidityData() {
return humidity;
}
public float getPressureData() {
return pressure;
}
}
对象显示的接口
public interface DisPlayElement {
void display();
}
这是观察者对象之一。
public class CurrentConditionObserver implements java.util.Observer, DisPlayElement {
private Observable observable;
private float temp;
private float humidity;
private float pressure;
public CurrentConditionObserver(Observable observable) {
this.observable=observable;
observable.addObserver(this);
}
@Override
public void display() {
System.out.println("当前天气状况:" + temp + ":" + humidity + ":" + pressure);
}
@Override
public void update(Observable obs, Object o) {
if (obs instanceof WeatherData){
WeatherData weatherData= (WeatherData) obs;
this.temp = weatherData.getTempData();
this.humidity = weatherData.getHumidityData();
this.pressure = weatherData.getPressureData();
}
display();
}
}
这是不变的main方法。
WeatherData weatherData = new WeatherData();
CurrentConditionObserver currentConditionObserver = new CurrentConditionObserver(weatherData);
weatherData.setChangedData(20,30,40.5f);
weatherData.setChangedData(40,90,70.5f);