观察者模式之气象监测站实例演示(一)

本文通过气象监测站的实例介绍观察者模式,解释其要点,包括一对多的关系、松耦合的更新方式等。文章讨论了WeatherData对象如何跟踪天气数据并通知多个布告板更新,强调了设计的可扩展性和Java中Observable和Observer的使用。文章还提醒读者注意在使用内置观察者模式实现时避免包冲突。
摘要由CSDN通过智能技术生成

最近在阅读HEAD+FIRST+设计者模式时,认为其中的事例非常有趣,于是希望在看的过程中,跟随书直接将代码演示,增进理解。同时将一些内容放到自己的博客中,方便日后查阅,或者其他小伙伴们看。

观察者模式要点:

1、观察者模式定义了对象之间一对多的关系

2、主题(也就是可观察者)用一个共同的接口来更新观察者

3、观察者和可观察者之间用松耦合方式结合(loosecoupling),可观察者不知道观察者的细节,只知道观察者实现了观察者接口

4、使用此模式时,你可从被观察者推(push)或拉(get)数据(然而,推的方式被认为更“正确”)。

5、有多个观察者时,不可以依赖特定的通知次序。

6、Java有多种观察者模式的实现,包括了通用的Java.util.Observable。

7、要注意Java.util.Observable实现上所带来的一些问题

8、如果有必要的话,可以实现自己的Observable,这并不难,不要害怕

9、Swing大量使用观察者模式,许多GUI框架也是如此。

10、此模式也被应用在许多地方,例如:JavaBeans、RMI。

 

观察者模式实例讲解以一个工作合约开始:

    恭喜贵公司获选为敝公司建立下一代Internet气象观测站!该气象站必须建立在我们专利申请中的WeatherData对象上,由WeatherData对象负责追踪目前的天气状况(温度、湿度、气压)。我们希望贵公司能建立一个应用,有三种布告板,分别显示目前的状况、气相统计以及简单的预报。当WeatherData对象获得最新的测量数据时,是那种布告板必须实时更新。

    而且这是一个可扩展的气象站,weather-o-Rama气象站希望公布一组API,好让其他开发人员可以写出自己的气象布告板,并插入此应用中。我们希望贵公司能提供这样的API。

   weather-o-Rama气象站有很好的的商业运营模式:一旦客户上钩,他们使用每个布告板都要付钱。最好的部分就是,为了感谢贵公司建立此系统,我们将以公司的认股权支付你。

需求分析:

如上描述了客户的需求,经过分析:

  WeatherData对象知道如何跟物理气象站联系,以取得更新的数据。weatherData对象取得数据,并更新三个布告板。

WeatherData对象有三个方法,getTemperature()、getHumidity()、getPressure() 方法分别获取这些值,

mentsChanged()方法可以通知外界,数值发生变化了!而我们的代码就要在该方法中被调用

当前已知环境:

   1、WeatherData 类具有getter方法,可以取得测量值:温度、湿度与气压

   2、当新的测量数据备妥时,measurementsChanged()方法就会被调用(我们不在乎此方法是如何被调用的,我们只在乎它被调用了)。

  3、我们需要实现三个使用天气数据的布告板:“目前状况“布告、”气相统计”布告、“天气预报”布告。一旦WeatherData有新的测量,这些布告必须马上更新。

  4、此系统必须可扩展,让其他开发人员建立定制的布告板,用户可以随心所欲地添加或删除任何布告板,目前初始的布告板有三类:“目前状况”布告、“气象监测”布告、“天气预告”布告

先简单以一个不妥的方案来简单示意一下,之后再提供完整的设计

    //不妥方案示例
    public void measurementsChanged(){
        float temp=getTempreture();
        int hum=getHumidity();
        float pressure=getPressure();
        CurrentConditionsDisplay.update(temp,hum,pressure);
        ForeCastConditionDisplay.update(temp,hum,pressure);
        SatisfyConditionDisplay.update(temp,hum,pressure);
    }

如上发现,该设计存在多种问题,代码移植困难,不具备可扩展性。按照“变化的进行封装”、“针对接口编程而不是实现编程”的原则,经过仔细分析,按照基本设计原则进行修改调整,最终完成,发现其符合观察者模式的条件:

1、气象数据对策和布告板具备一对多的关系,并且后者紧密依赖前者

2、一个气象数据对象掌握者某些数据状态的变化情况,而布告板需要这些状态值

3、 布告板可能有多种类型,但是有一些基本的特征,即他们都需要调用数据更新的方法。

4、布告板需要实时地关注该对象

(如上理解只是个人理解,描述不恰当的地方还请指正)

鉴于各种原因,先贴上代码

package com.example.zhouxueli.myapplication.ObserverDesign;

public interface Subject {
/**
* 观察者模式中的主题,
* 观察者模式定义了对象之间的一对多依赖,这样一来&#
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值