观察者模式
1. 定义
定义了对象之间一对多的关系,这样一样,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新。
2. 建造一个气象台
气象台实现接口
- 主题 Subject 作为 被观察者 接口,实现 注册观察者 registerObserver(), 除去观察者 removeObserver(),通知所有观察者
- Observer 作为 观察者接口,实现 update(float temp , float humidity, float pressure) 方法
- DisplayElement 作为 观察者显示的接口,实现 display()方法
- 被观察者 接口
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
- 观察者接口
public interface Observer {
public void update(float temp , float humidity , float pressure );
}
public interface DisplayElement {
public void display();
}
气象台实现类
被观察者 WeatherData
public class WeatherData implements Subject{
private float temp;
private float humidity;
private float pressure;
//构造函数时候创建
private ArrayList<Observer> observers;
// 所有观察者
public WeatherData(){
observers = new ArrayList<Observer>();
}
//注册观察者
public void registerObserver(Observer o) {
observers.add(o);
}
//删除观察者
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if(i >= 0){
observers.remove(i);
}
}
//通知观察者
public void notifyObserver() {
for(int i = 0 ; i < observers.size() ; i++){
Observer o = (Observer) observers.get(i);
o.update(temp,humidity,pressure);
}
}
public void setMeasurement(float temp , float humidity , float pressure){
this.temp = temp;
this.humidity = humidity;
this.pressure = pressure;
measurementChanged();
}
public void measurementChanged(){
notifyObserver();
}
public float getTemp() {
return temp;
}
public void setTemp(float temp) {
this.temp = temp;
}
public float getHumidity() {
return humidity;
}
public void setHumidity(float humidity) {
this.humidity = humidity;
}
public float getPressure() {
return pressure;
}
public void setPressure(float pressure) {
this.pressure = pressure;
}
}
事实情况 观察者 CurrentCondition
public class CurrentCondition implements Observer , DisplayElement {
private float temp;
private float humidity;
private Subject weatherDate;
public CurrentCondition(Subject weatherData){
this.weatherDate = weatherData;
weatherData.registerObserver(this);
}
public void update(float temp, float humidity, float pressure) {
this.temp = temp;
this.humidity = humidity;
display();
}
public void display(){
System.out.println("CurrentCondition : " + "temperature = " + temp +"℃ and " + "humidity = " + humidity + "%");
}
}
最大最小温度情况 观察者 MaxMinCondition
public class MaxMinCondition implements Observer , DisplayElement{
float maxTemp ;
float minTemp ;
Subject weatherData;
public MaxMinCondition(Subject weatherData){
this.weatherData = weatherData;
maxTemp = 0;
minTemp = 0;
weatherData.registerObserver(this);
}
public void update(float temp, float humidity, float pressure) {
if (maxTemp == 0 && minTemp == 0){
maxTemp = temp;
minTemp = temp;
}
else if(temp > maxTemp){
maxTemp = temp;
}else if (temp < minTemp){
minTemp = temp;
}
display();
}
public void display(){
System.out.println("MaxTemplate is " + maxTemp + "and MinTemplate is " + minTemp);
}
}