观察者模式(Observer)是一种一对多的关系,即多个观察者共同与同一个被观察者之间的联系; 这种模式的好处在于解耦合。
1、模式中的角色对象
抽象主题(Subject类):抽象主题即被观察者类的接口,为具体主题提供抽象接口
具体主题(ConcreteSubject类):一个有具体实现的主题类(被观察者类)
抽象观察者(Observer类):观察者类的抽象接口
具体观察者(ConcreteObserver类):实现抽象观察者接口的具体观察者类
2、角色关系图
3、实例
描述:假设某气象站要将实时天气信息公布在显示屏幕上,即当气象数据发生变量便马上更新显示屏内容
a.Subject接口
public interface Subject {
public abstract void registerObserver(Observer o);
public abstract void removeObserver(Observer o);
public abstract void notifyObservers();
}
b.
ConcreteSubject类
import java.util.ArrayList;
import com.interfaces.Observer;
import com.interfaces.Subject;
public class WeatherData implements Subject {
private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers=new ArrayList();
}
@Override
public void registerObserver(Observer o) {
// TODO Auto-generated method stub
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
// TODO Auto-generated method stub
int i=observers.indexOf(o);
if(i>=0){
observers.remove(i);
}
}
@Override
public void notifyObservers() {
// TODO Auto-generated method stub
for(int i=0;i<observers.size();i++){
Observer observer=(Observer)observers.get(i);
observer.update(temperature, humidity, pressure);
}
}
public void setMeasurements(float temperature,float humidity,float pressure){
this.temperature=temperature;
this.humidity=humidity;
this.pressure=pressure;
notifyObservers();
}
}
c.
Observer接口
public interface Observer {
public abstract void update(float temperature,float humidity,float pressure);
}
d.ConcreteObserver类
import com.interfaces.DisplayElement;
import com.interfaces.Observer;
import com.interfaces.Subject;
public class CurrentConditionDisplay implements Observer {
private float temperature;
private float humidity;
private float pressure;
private Subject weatherData;
public CurrentConditionDisplay(Subject weatherData) {
this.weatherData=weatherData;
weatherData.registerObserver(this);
// TODO Auto-generated constructor stub
}
public void display() {
// TODO Auto-generated method stub
System.out.println("Current donditions: "+temperature+"F degrees and "
+humidity+"% humidity"+" and pressure"+pressure);
}
@Override
public void update(float temperature, float humidity, float pressure) {
// TODO Auto-generated method stub
this.temperature=temperature;
this.humidity=humidity;
this.pressure=pressure;
display();
}
}
后记:
积跬步 至千里