第一节:观察者模式——需求说明&传统实现

一、需求说明

  天气预报项目需求,具体要求如下:

  1、气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)

  2、需要设计开发型 API,便于其他第三方也能接入气象站获取数据;

  3、提供温度、气压和湿度的接口;

  4、测量数据更新时,要能实时的通知第三方;

二、传统实现

  1、分析

    通过对气象站项目的分析,我们可以初步设计出一个 WeatherData 类:

       

  

    说明:

    (1)通过 getXxx 方法,可以让第三方接入,并得到相关信息;

    (2)当数据有更新时,气象站通过调用 dataChange() 去更新数据,当第三方再次获取时,就能得到最新数据,当然也可以推送

  2、代码实现

    核心类:WeatherData

 1 /**
 2  * 核心类
 3  *  1、包含最新的天气情况信息
 4  *  2、包含了 CurrentConditions 对象
 5  *  3、当数据有更新时,就主动的调用 currentConditions对象的 update 方法(含有display)
 6  *     这样他们(接入方)就看到了最新的信息
 7  */
 8 public class WeatherData {
 9 
10     private float temperatrue;
11     private float pressure;
12     private float humidity;
13     private CurrentConditions currentConditions;
14 
15     public WeatherData(CurrentConditions currentConditions) {
16         this.currentConditions = currentConditions;
17     }
18 
19     public float getTemperature() {
20         return temperatrue;
21     }
22 
23     public float getPressure() {
24         return pressure;
25     }
26 
27     public float getHumidity() {
28         return humidity;
29     }
30 
31     public void dataChange() {
32         currentConditions.update(getTemperature(), getPressure(), getHumidity());
33     }
34 
35     /**
36      * 当数据有更新时就调用 setData
37      * @param temperature
38      * @param pressure
39      * @param humidity
40      */
41     public void setData(float temperature, float pressure, float humidity) {
42         this.temperatrue = temperature;
43         this.pressure = pressure;
44         this.humidity = humidity;
45         //调用 dataChange 方法,将最新信息 推送给 接入方 currentConditions
46         dataChange();
47     }
48 }

    第三方调用者:

 1 /**
 2  * 显示当前天日情况(可以理解成是气象站自己的网站)
 3  */
 4 public class CurrentConditions {
 5     private float temperature; //温度
 6     private float pressure;    //气压
 7     private float humidity;    // 湿度
 8 
 9 
10     /**
11      * 更新天气情况,是由 WeatherData 来调用,使用的是 推送模式
12      * @param temperature
13      * @param pressure
14      * @param humidity
15      */
16     public void update(float temperature, float pressure, float humidity) {
17         this.temperature = temperature;
18         this.pressure = pressure;
19         this.humidity = humidity;
20         display();
21     }
22 
23 
24     /**
25      * 显示信息
26      */
27     public void display() {
28         System.out.println("***Today mTemperature: " + temperature + "***");
29         System.out.println("***Today mPressure: " + pressure + "***");
30         System.out.println("***Today mHumidity: " + humidity + "***");
31     }
32 }

    客户端:

 1 public class Client {
 2 
 3     public static void main(String[] args) {
 4         //创建接入方
 5         CurrentConditions currentConditions = new CurrentConditions();
 6 
 7         //创建 WeatherData 并将 接入方 currentConditions 传递到 WeatherData 中
 8         WeatherData weatherData = new WeatherData(currentConditions);
 9 
10         //更新天气情况
11         weatherData.setData(30, 150, 40);
12 
13         //天气情况变化了
14         System.out.println("-------天气情况发生变化---------");
15         weatherData.setData(40, 160, 20);
16     }
17 }

 

三、传统方案问题分析

  1、其他第三方接入气象站获取数据的问题;

  2、无法再运行时动态的添加第三方(如:百度,新浪等)

  3、违法OCP 原则

  

 

原文地址:https://www.cnblogs.com/niujifei/p/14413919.html