这个模式从字面上就很好理解了:肯定有一个观察的对象,然后有一群观察者。观察者模式我觉得更像是一种通知模式,当对象发生变化是,通知所有的观察者。
依然参用《Head First》的例子:
有一个气象站,测量温度(Temperature),湿度(Humidity),气压(Pressure)三个参数,有三个显示设备(观察者)。
首先可以分析一下:
1,肯定需要一个可供观察的对象WeatherData,这个对象肯定要有方法检测到三个参数的置,
2,这个对象肯定要维护一个观察者的队列;
3,这个对象肯定得有一个方法将参数变化通知所有观察者;
4,这个对象肯定有方法可以增加观察者或删除观察者。
5,所有观察者都有一个update方法。
具体程序如下:
//对象WeatherData的接口Subject
package Observer;
/**
* Created by sgzhang on 2015/8/12.
*/
public interface Subject {
void addObserver (Observer observer);
void deleteObserver(Observer observer);
void changeAll(float temp,float humidity,float pressure);//改变WeatherData
void notifyAllObersers();
}
//WeatherData,采用了一个ArrayList维护观察者队列。
package Observer;
import java.util.ArrayList;
import java.util.List;
/**
* Created by sgzhang on 2015/8/12.
*/
public class WeatherData implements Subject {
private float temp;
private float humidity;
private float pressure;
private List<Observer> observersArray=new ArrayList<Observer>();
public WeatherData(float temp, float pressure, float humidity) {
this.temp = temp;
this.pressure = pressure;
this.humidity = humidity;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
public float getTemp() {
return temp;
}
public void setTemp(float temp) {
this.temp = temp;
}
public void setPressure(float pressure) {
this.pressure = pressure;
}
public void setHumidity(float humidity) {
this.humidity = humidity;
}
@Override
public void changeAll(float temp,float humidity,float pressure){//改变WeatherData
setTemp(temp);
setHumidity(humidity);
setPressure(pressure);
notifyAllObersers();
}
@Override
public void addObserver(Observer observer){
observersArray.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
observersArray.remove(observer);
}
@Override
public void notifyAllObersers() {//通知所有观察者
for(Observer obs : observersArray){
obs.update(temp,humidity,pressure);
}
}
}
//所有的观察者都应该是观察者,这些观察者都具备update的能力
package Observer;
/**
* Created by sgzhang on 2015/8/12.
*/
public interface Observer {
void update(float temp,float humidity,float pressure);
}
//观察者1,Person1
package Observer;
/**
* Created by sgzhang on 2015/8/12.
*/
public class Person1 implements Observer {
@Override
public void update(float temp, float humidity, float pressure) {
System.out.println("Person1的气象参数为:"+temp+humidity+pressure);
}
}
//观察者2,Person2
package Observer;
/**
* Created by sgzhang on 2015/8/12.
*/
public class Person2 implements Observer {
@Override
public void update(float temp, float humidity, float pressure) {
System.out.println("Person2的气象参数为:"+temp+humidity+pressure);
}
}
//观察者2,Person2
package Observer;
/**
* Created by sgzhang on 2015/8/12.
*/
public class Person3 implements Observer {
@Override
public void update(float temp, float humidity, float pressure) {
System.out.println("Person3的气象参数为:"+temp+humidity+pressure);
}
}
接下来是主函数了
//RunMain
package Observer;
/**
* Created by sgzhang on 2015/8/12.
*/
public class RunMain {
public static void main(String[] args){
Subject weatherData=new WeatherData(0,0,0);
Observer person1=new Person1();
Observer person2=new Person2();
Observer person3=new Person3();
weatherData.addObserver(person1);
weatherData.addObserver(person2);
weatherData.addObserver(person3);
weatherData.changeAll(1, 1, 1);
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
weatherData.changeAll(2,2,2);
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
weatherData.changeAll(3,3,3);
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
weatherData.deleteObserver(person1);
weatherData.changeAll(4,4,4);
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
}
}