用观察者模式设计一个气象台

  • 背景
  • 部分代码
  • Client运行展示

观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

背景

气象站测量气象数据为客户提供多种气象布告信息服务,为此气象站希望通过自己提供的 气象数据 为客户开发不同的布告版的应用软件,包括 目前状况布告版简单预报布告版气象统计布告版 等,并且当得到新的气象数据测量结果后,每个客户订购的布告版信息都应实时更新。

部分代码

Subject.java

package WeatherStationDemo;import java.util.ArrayList;public abstract class Subject {protected ArrayList<Observer> observers = new ArrayList<Observer>();public abstract void notifyObserver();//通知public abstract void registerObserver(Observer o); //注册public abstract void removeObserver(Observer o); //移除}

WeatherData.java

package WeatherStationDemo;public class WeatherData extends Subject{private double temperature;private double humidity;private double pressure;public WeatherData() {}//getter/setter方法public double getTemperature() {return temperature;}public void setTemperature(double temperature) {this.temperature = temperature;}public double getHumidity() {return humidity;}public void setHumidity(double humidity) {this.humidity = humidity;}public double getPressure() {return pressure;}public void setPressure(double pressure) {this.pressure = pressure;}public void setMeasurements(double temperature,double humidity,double pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;}/** public boolean measurementsChanged() { System.out.println("气象数据变更……"); flag =* true; return flag; }*/@Overridepublic void notifyObserver() {for(Observer o : observers) {o.update();}}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}}

Observer.java

package WeatherStationDemo;public abstract class Observer {protected WeatherData weatherData;public abstract void update();
}

CurrentSituationDisplay.java

package WeatherStationDemo;public class CurrentSituationDisplay extends Observer{public CurrentSituationDisplay(WeatherData weatherData) {this.weatherData = weatherData;}@Overridepublic void update() {System.out.println("——————目前状况布告板——————");System.out.println("目前的气温:"+ weatherData.getTemperature() + "℃");System.out.println("目前的湿度:"+ weatherData.getHumidity() + "%");System.out.println("目前的气压:"+ weatherData.getPressure() + "kpa");}}

Client.java

package WeatherStationDemo;public class Client {public static void main(String[] args) {// TODO Auto-generated method stubWeatherData weatherData = new WeatherData();weatherData.setMeasurements(25.3, 90, 102.5);Observer currentObserver = new CurrentSituationDisplay(weatherData);Observer statisticsObserver = new WeatherStatisticsDispaly(weatherData);Observer forecastObserver = new SimpleForecastDisplay(weatherData);weatherData.registerObserver(currentObserver);weatherData.registerObserver(statisticsObserver);weatherData.registerObserver(forecastObserver);weatherData.notifyObserver();}}

Client运行展示

技术有限…有不合理之处,见谅(○´・д・)ノ

用观察者模式设计一个气象台相关推荐

  1. 利用观察者模式设计一个学校铃声的事件处理程序

    分析:在本实例中,学校的"铃"是事件源和目标,"老师"和"学生"是事件监听器和具体观察者,"铃声"是事件类.学生和老师来 ...

  2. 如何设计一个高可用的运营系统

    转载自   如何设计一个高可用的运营系统 这是一篇来自粉丝的投稿,作者[林湾村龙猫]近一年在做关于运营活动方面的设计.本文是他的关于运营活动的总结,Hollis做了一点点修改. 概述 一个产品业务的发 ...

  3. 观察者模式设计qq邮箱日历提醒 -- qq终端,qq邮箱终端,微信终端提醒

    CleverCode最近在使用qq邮箱日历提醒,这个日历提醒可以通过邮箱,微信等多个终端发送提醒消息,能够及时提醒用户需要做某件事了.CleverCode刚好也在看观察者模式,所以将他用设计模式的方式 ...

  4. java 设计一个geometricobject类,geometricobject类

    (2) Circle 类和 Rectangle 类是 GeometricObject 类的子类,其中应实现 父类的抽象方法. (3) 程序主方法中创建两个几何对象,一个圆和一个矩形,并用 ...... ...

  5. 设计一个矩形类rectangle_万字长文带你捋清六种设计模式的设计原则(建议收藏)...

    对于设计模式,自己很早之前就看了好多本设计模式书籍,其中一些还看了好几遍,也一直希望自己能在编码的时候把这些设计模式用上去.可是,在日常的打码中,用的最多的就是单例,其次是观察者和建造者模式 ( bu ...

  6. 如何更新你的机器学习模型?手把手带你设计一个可持续的预测模型!

    作者 | CloudFactory 译者 | 天道酬勤 责编 | 徐威龙 出品 | AI科技大本营(ID:rgznai100) 高效的机器学习模型需要高质量的数据.训练你的机器学习模型并不是过程中的单 ...

  7. 如何设计一个支撑数亿用户的系统

    欢迎关注方志朋的博客,回复"666"获面试宝典 要设计出一套能支撑几十亿人的系统是很困难的.对于软件架构师来说,这一直是一项很大的挑战,但是,从现在开始,看完我的文章,你就会觉得容 ...

  8. 教你设计一个超牛逼的本地缓存!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:ksfzhaohui juejin.im/post/5dd9 ...

  9. 如何设计一个牛逼的本地缓存

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:ksfzhaohui juejin.im/post/5dd9 ...

  10. 如何设计一个本地缓存

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://i7q.cn/4xPYgB 前言 最近在看My ...

最新文章

  1. jquery下拉菜单
  2. 超级直播tv港澳台版2020_直播链接 2020年泉州足球超级联赛 第一轮
  3. WeifenLuo.WinFormsUI.Docking
  4. 用Matplotlib跟踪疫情实时监控2019-nCoV
  5. 【深度学习】人脸识别模型的动手实践!
  6. 数据段、代码段、堆栈段、BSS段的区别
  7. pytorch学习 入门篇(一)
  8. app inventor2 打地鼠_春节越南旅行攻略必备手机APP推荐!旅游必备实用简单越南语...
  9. iPhone 13 Pro“终极”渲染图曝光:后置镜头模组将有大幅升级
  10. 每日一程-4. PyQt5-实现显示和业务逻辑分离
  11. php面试题之三——PHP网络编程(高级部分)
  12. Qt_MsgBox 非常简单 自定义实现类似QMessageBox的弹窗 静态调用
  13. STM32中使用PS2手柄
  14. 如何取消服务器自动关机,XP系统怎么取消自动关机?
  15. freeswitch通话记录mysql_freeswitch电话计费详单入库方法
  16. python海龟交易源码,福利到!用 Python 实现海龟交易系统
  17. VMware Workstation 英文改中文界面
  18. 微博开放平台-发微博测试
  19. Python数据结构之栈(LIFO)
  20. 企业邮箱哪家最优惠?企业邮箱最优惠价格来了

热门文章

  1. gatk过滤_详解GATK突变硬过滤 | 群体遗传专题
  2. 百度地图API去掉百度logo信息等
  3. 编译原理——中间代码生成(逆波兰表示)
  4. linux——CPU使用率、内存使用率、磁盘使用率等详解
  5. 前端之JS篇(七)——Web APIsDOM部分内容
  6. 我想请教一下我这个错误的原因以及怎么解决,求各位大佬帮忙,感激不尽。
  7. 2022年事件驱动策略研究报告
  8. 【Canvas】字体图标一、 Unicode 字体符号绘制 / 兼容IE
  9. java jersey_Jersey框架
  10. c语言判断字符串str1中含有字符串str2(是否为子串问题)