观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态是,它的所有依赖者都会收到通知并自动更新。
这个在项目中一般用来数据的多种处理,比如系统收到了数据 然后系统处理,但同时可能需要把数据发送给第三方。这种模式和消息队列很相似。
public interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
public interface Observer {
void update(float temp,float humidity,float pressure);
}
public interface DisplayElement {
void display();
}
public class CurrentConditionsDisplay implements Observer,DisplayElement{
private float temperature;
private float humidity;
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
public void display() {
System.out.println(toString());
}
@Override
public String toString() {
return "CurrentConditionsDisplay [temperature=" + temperature + ", humidity=" + humidity + "]";
}
public void update(float temp, float humidity, float pressure) {
this.temperature = temp;
this.humidity = humidity;
display() ;
}
}
public class ForecastDisplay implements Observer,DisplayElement{
private float temperature;
private float humidity;
private Subject weatherData;
public ForecastDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
public void display() {
System.out.println(toString());
}
@Override
public String toString() {
return "ForecastDisplay [temperature=" + temperature + ", humidity=" + humidity + "]";
}
public void update(float temp, float humidity, float pressure) {
this.temperature = temp;
this.humidity = humidity;
display() ;
}
}
public class StatisticsDisplay implements Observer,DisplayElement{
private float temperature;
private float humidity;
private Subject weatherData;
public StatisticsDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
public void display() {
System.out.println(toString());
}
@Override
public String toString() {
return "StatisticsDisplay [temperature=" + temperature + ", humidity=" + humidity + "]";
}
public void update(float temp, float humidity, float pressure) {
this.temperature = temp;
this.humidity = humidity;
display() ;
}
}
public class WeatherStation {
public static void main(String[] args) {
//创建主题
WeatherData weatherData = new WeatherData();
//创建观察者 并对主题进行订阅
CurrentConditionsDisplay ccd = new CurrentConditionsDisplay(weatherData);
StatisticsDisplay ssd = new StatisticsDisplay(weatherData);
ForecastDisplay fcd = new ForecastDisplay(weatherData);
//每一次改变数据 订阅过的观察者都会做出相应的改变
weatherData.setMeasurements(1f, 11f, 111f);
weatherData.setMeasurements(2f, 22f, 222f);
weatherData.setMeasurements(3f, 33f, 333f);
}
}