1、实例链接:https://github.com/BaronZ88/DesignPatterns/tree/master/src/com/baron/patterns/observer/observer
2、原理:
在此项目中CurrentConditionsDisplay和ForecastDisplay为观察者,天气数据WeatherData为被观察者,被观察者通过Subject接口完成对观察者的注册、移除、和发送通知,观察者通过Observer和DisplayElement接口完成对自身数据的更新和显示,这样就可以完成实时显示天气数据和天气预报的功能。
3、实现:
@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 : observers) { | |
observer.update(); | |
} | |
} | |
//发送通知 | |
CurrentConditionsDisplay类:
@Override | |
public void display() { | |
System.out.println("当前温度为:" + this.temperature + "℃"); | |
System.out.println("当前湿度为:" + this.humidity); | |
System.out.println("当前气压为:" + this.pressure); | |
} | |
@Override | |
public void update() { | |
this.temperature = this.weatherData.getTemperature(); | |
this.humidity = this.weatherData.getHumidity(); | |
this.pressure = this.weatherData.getPressure(); | |
display(); | |
} |
ForecastDisplay类:
@Override | |
public void display() { | |
System.out.println("未来几天的气温"); | |
int count = forecastTemperatures.size(); | |
for (int i = 0; i < count; i++) { | |
System.out.println("第" + i + "天:" + forecastTemperatures.get(i) + "℃"); | |
} | |
} | |
@Override | |
public void update() { | |
this.forecastTemperatures = this.weatherData.getForecastTemperatures(); | |
display(); | |
} |
4、好处
(1)松耦合,抽象主题只和观察者有关
(2)可进行广播通信,跨界面