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


    一、需求说明

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

      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 原则

      

     

  • 相关阅读:
    拍皮球 (Java实现)
    余弦 (java实现)
    循环输出
    从1输出n位数字
    数值的整数次方
    旋转数组的最小数字
    简单使用栈实现队列
    重建二叉树
    链表逆序输出
    替代空格
  • 原文地址:https://www.cnblogs.com/niujifei/p/14413919.html
Copyright © 2020-2023  润新知