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)可进行广播通信,跨界面