/*
主题接口
*/
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
/*
主题类
*/
public class WeatherData implements Subject {
private ArrayList<Observer> obervers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData(){
obervers=new ArrayList<Observer>();
}
public void registerObserver(Observer o) {
obervers.add(o);
}
public void removeObserver(Observer o) {
obervers.remove(o);
}
public void notifyObservers() {
for(Observer o:obervers)
o.update(temperature,humidity,pressure);
}
public void measurementsChanged(){
notifyObservers();
}
public void setMeasurements(float temperature,float humidity,float pressure){
this.temperature=temperature;
this.humidity=humidity;
this.pressure=pressure;
measurementsChanged();
}
}
/*
观察者接口
*/
public interface Observer {
public void update(float temp,float humidity,float pressure);
}
/*
布告栏接口
*/
public interface DisplayElement {
public void display();
}
/*
观察者类
*/
public class CurrentConditionsDisplay implements Observer,DisplayElement {
private float temperature;
private float humidity;
private float pressure;
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData){
this.weatherData=weatherData;
weatherData.registerObserver(this);
}
public void update(float temperature, float humidity, float pressure) {
this.temperature=temperature;
this.humidity=humidity;
this.pressure=pressure;
display();
}
public void display() {
System.out.println(String.format("temperature:%f\nhumidity:%f\npressure:%f\n",temperature,humidity,pressure));
}
}
/*
测试
*/
public class UnitTest {
@Test
public void test(){
WeatherData weatherData=new WeatherData();
CurrentConditionsDisplay currentConditionsDisplay= new CurrentConditionsDisplay(weatherData);
weatherData.setMeasurements(10,20,30);
}
}
观察者模式的应用:按钮的监听事件