目录
正常实现就是在气象站中聚合第三方,当数据发生变化是调用第三方的方法实现数据更新。
新增第三方时违反ocp原则, 不利于维护,也不能动态加入。

其实可以没有Subject接口,主要的类就是WeatherData,里面聚合一个Observe的List,实现观察者注册,删除,通知等功能。
Observer:观察者接口。
- //观察者接口,有观察者来实现
- public interface Observer {
-
- public void update(float temperature, float pressure, float humidity);
- }
-
-
-
- public class CurrentConditions implements Observer {
-
- // 温度,气压,湿度
- private float temperature;
- private float pressure;
- private float humidity;
-
- // 更新 天气情况,是由 WeatherData 来调用,我使用推送模式
- public void update(float temperature, float pressure, float humidity) {
- this.temperature = temperature;
- this.pressure = pressure;
- this.humidity = humidity;
- display();
- }
-
- // 显示
- public void display() {
- System.out.println("***Today mTemperature: " + temperature + "***");
- System.out.println("***Today mPressure: " + pressure + "***");
- System.out.println("***Today mHumidity: " + humidity + "***");
- }
- }
-
-
-
- public class BaiDu implements Observer{
-
- // 温度,气压,湿度
- private float temperature;
- private float pressure;
- private float humidity;
- @Override
- public void update(float temperature, float pressure, float humidity) {
- this.temperature = temperature;
- this.pressure = pressure;
- this.humidity = humidity;
- display();
- }
-
- // 显示
- public void display() {
- System.out.println("===百度网站====");
- System.out.println("***百度网站 气温 : " + temperature + "***");
- System.out.println("***百度网站 气压: " + pressure + "***");
- System.out.println("***百度网站 湿度: " + humidity + "***");
- }
- }
WeatherData
- public class WeatherData {
-
- // 温度,气压,湿度
- private float temperature;
- private float pressure;
- private float humidity;
- //第三方集合
- private List
observers; -
- public WeatherData() {
- this.observers = new ArrayList<>();
- }
-
- //当数据有更新时,就调用 setData
- public void setData(float temperature, float pressure, float humidity) {
- this.temperature = temperature;
- this.pressure = pressure;
- this.humidity = humidity;
- //调用dataChange, 将最新的信息 推送给 接入方 currentConditions
- notifyObservers();
- }
-
- //注册一个观察者
- public void registerObserve(Observer o) {
- observers.add(o);
- }
-
- //移除一个观察者
- public void removeObserve(Observer o) {
- observers.remove(o);
- }
- //遍历所有的观察者,并通知
- public void notifyObservers() {
- observers.forEach(a -> a.update(this.temperature, this.pressure, this.humidity));
- }
-
- public float getTemperature() {
- return temperature;
- }
-
- public void setTemperature(float temperature) {
- this.temperature = temperature;
- }
-
- public float getPressure() {
- return pressure;
- }
-
- public void setPressure(float pressure) {
- this.pressure = pressure;
- }
-
- public float getHumidity() {
- return humidity;
- }
-
- public void setHumidity(float humidity) {
- this.humidity = humidity;
- }
-
- public List
getObservers() { - return observers;
- }
-
- public void setObservers(List
observers) { - this.observers = observers;
- }
- }
Client
- public class Client {
- public static void main(String[] args) {
-
- WeatherData weatherData = new WeatherData();
-
- Observer baiDu = new BaiDu();
- CurrentConditions currentConditions = new CurrentConditions();
-
- weatherData.registerObserve(baiDu);
- weatherData.registerObserve(currentConditions);
-
- weatherData.setData(10f,20f,30f);
-
- System.out.println("=======================");
-
- weatherData.removeObserve(baiDu);
- weatherData.setData(100f,200f,300f);
-
- }
- }
JDK的 Observable类 就是JDK帮我们写好的一个观察者模式。
Observable:相当于Weather,已经帮我们写好了管理Observer的方法。
Observer:就是我们刚才写的接口。
