一个天气预报的项目,需求如下:
/***
* @author shaofan
* @Description 传统方案解决天气预报需求
*/
public class WeatherForecast {
public static void main(String[] args) {
WeatherCondition weatherCondition = new WeatherCondition();
WeatherData weatherData = new WeatherData(weatherCondition);
weatherData.setData(1,1,1);
System.out.println(weatherCondition);
weatherData.setData(2,2,2);
System.out.println(weatherCondition);
}
}
/***
* 第三方天气信息
*/
class WeatherCondition{
private float temperature;
private float pressure;
private float humidity;
public void update(WeatherData weatherData){
this.temperature = weatherData.getTemperature();
this.pressure = weatherData.getPressure();
this.humidity = weatherData.getHumidity();
}
@Override
public String toString() {
return "WeatherCondition{" +
"temperature=" + temperature +
", pressure=" + pressure +
", humidity=" + humidity +
'}';
}
}
/***
* 气象站天气信息
*/
class WeatherData{
private float temperature;
private float pressure;
private float humidity;
private WeatherCondition weatherCondition;
public WeatherData(WeatherCondition weatherCondition){
this.weatherCondition = weatherCondition;
}
public float getTemperature() {
return temperature;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
/**
* 气象站更新第三方的天气
*/
private void weatherUpdate(){
weatherCondition.update(this);
}
/**
* 气象站检测到天气更新
* @param temperature
* @param pressure
* @param humidity
*/
public void setData(float temperature,float pressure,float humidity){
this.temperature =temperature;
this.pressure = pressure;
this.humidity = humidity;
weatherUpdate();
}
}
新增一个第三方,都需要创建一个新的第三方对象,并加入都dataChange中,不利于维护,也不是动态加入

/***
* @author shaofan
* @Description 观察者模式解决天气预报问题
*/
public class WeatherForecast {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
WeatherCondition weatherCondition = new WeatherCondition();
weatherData.registerObserver(weatherCondition);
weatherData.setData(1,1,1);
System.out.println(weatherCondition);
}
}
/***
* 被订阅方
*/
interface Subject{
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
/***
* 观察者
*/
interface Observer{
void update(WeatherData weatherData);
}
class WeatherData implements Subject{
private float temperature;
private float pressure;
private float humidity;
private List<Observer> observers;
public WeatherData(){
observers = new ArrayList<>();
}
public float getTemperature() {
return temperature;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
@Override
public void registerObserver(Observer observer) {
this.observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
this.observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : this.observers) {
observer.update(this);
}
}
public void setData(float temperature,float pressure,float humidity){
this.temperature =temperature;
this.pressure = pressure;
this.humidity = humidity;
notifyObservers();
}
}
class WeatherCondition implements Observer{
private float temperature;
private float pressure;
private float humidity;
@Override
public void update(WeatherData weatherData) {
this.temperature = weatherData.getTemperature();
this.pressure = weatherData.getPressure();
this.humidity = weatherData.getHumidity();
}
@Override
public String toString() {
return "WeatherCondition{" +
"temperature=" + temperature +
", pressure=" + pressure +
", humidity=" + humidity +
'}';
}
}
jdk中Observeable类,使用了观察者模式
