一、需求说明
天气预报项目需求,具体要求如下:
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 原则