项目介绍:高温预警系统旨在气象部门根据气象卫星获得相关的天气温度信息,当温度超过某一阈值时,向各个单位和个人发出高温警报通知,以及时做好高温防护措施。这是一个典型的观察者模式使用场景。

项目代码链接:

https://github.com/hj841104031/MyJavaProject

系统结构图如下图所示:

模式分析:

高温预警过程分析

1.想要得到温度信息,这需要气温关注者 “订阅”高温预警服务。

Observer的接口定义如下:

package Observer;

public interface Observer {

public void update(Subject subject);

}

Person类对Observer的具体实现如下:

package Observer;

public class Person implements Observer {

public Person(Subject subject) {

subject.add(this);

}

public void update(Subject subject) {

System.out.println("个人收到高温预警:" + subject.temperatureReport());

}

}

观察者接口定义了update的方法,当有温度信息时接收温度信息。程序代码中包含有三个观察者,分别是Person、Company与Government。这三个具体的观察者分别对update函数进行了相应的重写。

总的来说观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体现察者聚集,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。

2.高温预警系统需要知道哪些对象是需要通知的。这需要预警系统维护一个关注者列表。

3.高温预警系统在温度达到阈值的时候,通知所有“订阅”服务的关注者。如何通知呢?这需要气温关注者具备接收通知的功能。

为了实现以上两个功能需要将Subject接口的定义如下:

package Observer;

public interface Subject {

// 增加观察者

public boolean add(Observer observer);

// 删除观察者

public boolean remove(Observer observer);

// 通知所有观察者更新数据

public void notifyAllObserver();

// 设置温度值

public void setTemperature(float temperature);

// 获得温度预警

public String temperatureReport();

}

这个抽象主题类实现了以下的功能:

增加观察者

删除观察者

通知所有观察者更新数据

设置温度值

获得温度预警

以及对Subject接口的具体实现类ForcastSystem的代码如下:

package Observer;

import java.util.Iterator;

import java.util.Vector;

public class ForcastSystem implements Subject {

private float temperature;// 温度

private String warningLevel;// 预警级别

private final Vector vector;// 观察者列表

// 构造方法 初始化观察者列表

public ForcastSystem() {

vector = new Vector();

}

// 增加观察者

public boolean add(Observer observer) {

if (observer != null && !vector.contains(observer)) {

return vector.add(observer);

}

return false;

}

// 移除观察者

public boolean remove(Observer observer) {

return vector.remove(observer);

}

// 通知所有观察者更新数据

public void notifyAllObserver() {

System.out.println("======气象部门发布高温" + this.warningLevel + "警报!======");

Iterator iterator = vector.iterator();

while (iterator.hasNext()) {

(iterator.next()).update(this);

}

}

// 私有方法 根据温度值设置预警级别 然后通知所有观察者

private void invoke() {

if (this.temperature >= 35) {

if (this.temperature >= 35 && this.temperature < 37) {

this.warningLevel = "黄色";

} else if (this.temperature >= 37 && this.temperature < 40) {

this.warningLevel = "橙色";

} else if (this.temperature >= 40) {

this.warningLevel = "红色";

}

// 通知所有观察者温度状况

this.notifyAllObserver();

}

}

// 设置温度值

public void setTemperature(float temperature) {

this.temperature = temperature;

this.invoke();

}

// 获得温度预警

public String temperatureReport() {

return " 温度:" + this.temperature;

}

public void notifyAllObserver()这个函数调用了iterator迭代器来判断是否有数据信息的更新操作,如果有新的数据被更新,则向所有的观察者发送最新的温度消息。

总的来看 高温预警系统和气温关注者,两者关系如下图所式:

静态建模

进一步将整个系统抽象,形成的静态关系结构如下图所示。

观察者模式的优点

当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。在我们的这个网络监控中,观察者依赖于被观察者。

当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个对象待改变。当被观察者的数据要发生改变时,对应的观察者的数据也要改变,这个时候只要将被观察者里的观察者集合都改变了就可以了

当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,你不希望这些对象是紧密耦合的。

在观察者和被观察者之间建立了一个耦合,对于被观察者来说,他只对它的观察者集合负责,然后具体的网络改变都是通过接口传递,只需要改变setTempearture()与notifyAllObserver()即可,剩下的不需要被观察者在意。被观察者也不需要知道观察者都有些谁。

而对于观察者而言,它不需要知道被观察者的情况,只需要知道接口传下来的netaciton(具体动作如网络状态、WiFi改变),执行自己的update()更新自己的状态即可。

它们没有紧密的耦合,可以属于不同的抽象化层次

一旦数据改变,支持广播通信很适合被观察者向每一个观察者广播改变网络状态的通知。

Java期末项目体温监测系统,作业三:高温预警系统项目中的观察者模式解析相关推荐

  1. 计算机毕业设计Java农田节水灌溉监测系统(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Java农田节水灌溉监测系统(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java农田节水灌溉监测系统(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目架构:B ...

  2. 作业三_C#中的观察者模式解析

    作业三_C#中的观察者模式解析 一.观察者模式的理解分析 由于之前没有接触过观察者模式,所以找了一段源码编译运行调试一下.下面是观察者模式用C#模拟实现的示意源码.该段代码模拟了观察者模式的一个运行原 ...

  3. 大项目之网上书城(三)——主页(中)

    目录 大项目之网上书城(三)--主页(中) 主要改动 1.主页持续施工中 代码 效果图 2.index.js 代码 3.ReMenServlet 代码 4.XinShuServlet 代码 5.Xin ...

  4. 作业三:高温预警系统项目中的观察者模式解析

    项目介绍:高温预警系统旨在气象部门根据气象卫星获得相关的天气温度信息,当温度超过某一阈值时,向各个单位和个人发出高温警报通知,以及时做好高温防护措施.这是一个典型的观察者模式使用场景. 项目代码链接: ...

  5. 无线体温监测系统的设计

    1        网络结构和应用软件 1.1    网络结构 基于局域网的网络拓扑结构(有线) 基于局域网的网络拓扑结构(无线,不推荐使用) 基于广域网的网络拓扑结构(图中AC1000建议改为公有云或 ...

  6. 住宅混合公建用地项目能耗监测系统

    1 引言 随着社会的发展,能源的消耗量也在迅速增长,特别是建筑能耗的增长特别迅速,已经成为除工业.交通外的第三大能源消耗.按照当前建筑业的发展趋势,在若干年后社会的能源产出将无法满足能源的需求,所以减 ...

  7. 能耗监测系统在淼泉卫生院项目的应用

    安科瑞 华楠 随着社会生活水平的提高和经济繁荣,人们对能源的需求逐渐增加,能源危机日益严重.如何实时了解.分析和控制办公楼.医院.商场等场所的能耗已成为亟待解决的问题.传统的能源消耗只能在每月/季度/ ...

  8. 网络存储与容灾系统-作业三

    假设一个应用程序的I/O吞吐量是5200IOPS,其中70%是读访问,则RAID6中磁盘负载是多少?若磁盘的吞吐量是180 IOPS,利用率要求低于70%,则RAID6需要多少磁盘? 答:RAID6写 ...

  9. 国际项目投标那些事(三)海外项目招标文件的组成

    以一个实际的项目作为例子,是我2020年初投的一个东南亚国家的水厂的竞争性投标.这个投标的招标基于FIDIC yellow book (Design and Build) 合同模板. 海外项目的招标一 ...

最新文章

  1. @ImportResource SpringBoot使用xml配置Bean
  2. 我为什么强烈反对程序员加班?
  3. mysql导出 error1290_解决MySQL导出数据到文件报错:ERROR 1290
  4. Maven无法上传到到私服
  5. Hadoop应用实战100讲(二)-Hadoop常用命令汇总
  6. mysql重装要删注册表_Mysql重装问题—删除注册表
  7. 命令行请求jsp页面_JSP 之 8种HTTP的请求方式 之 页面组成等
  8. Acer Travelmate T3290笔记本拆机指南
  9. STM32的RTC万年历显示问题
  10. Word中两端对齐、分散对齐的区别
  11. 实时人脸识别例子-tensorflow2.x keras
  12. C++ const常量和指针
  13. python文件命名 数字_python 批量修改数字类的文件名
  14. NYOJ 972(蓝桥杯) 核桃的数量
  15. 室外无线AP覆盖解决方案
  16. 博科br310交换机级联
  17. 2018东南大学 SUS 十一欢乐赛 pwn解题记录
  18. 应用JavaFX实现的填字游戏
  19. python人机猜拳游戏代码_python 实现人和电脑猜拳的示例代码
  20. python笔迹识别_python_基于Scikit learn库中KNN,SVM算法的笔迹识别

热门文章

  1. PHP发送邮件功能实现
  2. excel图片链接转批量图片再加上超链接(简陋版)
  3. 数学之美:激发思考的奥秘
  4. SWOT分析、PEST分析、GE矩阵、波士屯矩阵等分析方法
  5. android中的插件开发框架,设计并开发一个 Android 的插件化框架
  6. XWPFTableRow、XWPFTableCell设置字体格式
  7. 三种代码版本控制系统的简介 以及 SVN的安装
  8. chrome夜间模式插件----强推
  9. Apache ShardingSphere 首篇论文被 ICDE 收录,全球数据库发展迎来新局面
  10. 2015电源题笔记(双向DCDC)