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

1) 气象站能够将天天测量到的温度,湿度,气压等等以公告的形式发布出去(好比发布到本身的网站或第三方)。java

2) 须要设计开放型 API,便于其余第三方也能接入气象站获取数据。ide

3) 提供温度、气压和湿度的接口源码分析

4) 测量数据更新时,要能实时的通知给第三方测试

2 天气预报设计方案 1-普通方案

WeatherData 类

传统的设计方案

代码实现

packagecom.lin.observer;/*** 显示当前天气状况(能够理解为气象站的网站)

* @Description:

*@authorLinZM

* @date 2021-2-7 12:49:27

*@versionV1.8*/

public classCurrentConditions {//温度,气压,湿度

private floattemperatrue;private floatpressure;private floathumidity;//更新天气状况

public void update(float temperature, float pressure, floathumidity) {this.temperatrue =temperature;this.pressure =pressure;this.humidity =humidity;

display();

}public voiddisplay(){

System.out.println("===Today's temperature: "+temperatrue+"===");

System.out.println("===Today's pressure: "+pressure+"===");

System.out.println("===Today's humidity: "+humidity+"===");

}

}

packagecom.lin.observer;/** 类是核心 1. 包含最新的天气状况信息 2. 含有 CurrentConditions 对象 3. 当数据有更新时,就主动的调用

* CurrentConditions 对象 update 方法(含 display), 这样他们(接入方)就看到最新的信息*/

public classWeatherData {private floattemperatrue;private floatpressure;private floathumidity;privateCurrentConditions currentConditions;//加入新的第三方

publicWeatherData(CurrentConditions currentConditions) {this.currentConditions =currentConditions;

}public floatgetTemperature() {returntemperatrue;

}public floatgetPressure() {returnpressure;

}public floatgetHumidity() {returnhumidity;

}public voiddataChange() {//调用 接入方的 update

currentConditions.update(getTemperature(), getPressure(), getHumidity());

}//当数据有更新时,就调用 setData

public void setData(float temperature, float pressure, floathumidity) {this.temperatrue =temperature;this.pressure =pressure;this.humidity =humidity;//调用 dataChange, 将最新的信息 推送给 接入方 currentConditions

dataChange();

}

}

packagecom.lin.observer;public classClient {public static voidmain(String[] args) {

CurrentConditions currentConditions= newCurrentConditions();

WeatherData weatherData= newWeatherData(currentConditions);

weatherData.setData(10, 20, 3);

}

}

问题分析

1) 其余第三方接入气象站获取数据的问题网站

2) 没法在运行时动态的添加第三方 (新浪网站)this

3) 违反 ocp 原则=>观察者模式spa

//在 WeatherData 中,当增长一个第三方,都须要建立一个对应的第三方的公告板对象,并加入到 dataChange, 不利于维护,也不是动态加入设计

public void dataChange() {3d

currentConditions.update(getTemperature(), getPressure(), getHumidity());code

}

3 观察者模式原理

1) 观察者模式相似订牛奶业务

2) 奶站/气象局:Subject

3) 用户/第三方网站:Observer

Subject:登记注册、移除和通知

1) registerObserver 注 册

2) removeObserver 移 除

3) notifyObservers() 通知全部的注册的用户,根据不一样需求,能够是更新数据,让用户来取,也多是实施推送, 看具体需求定

Observer:接收输入

观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为 Subject,依赖的对象为 Observer,Subject

通知 Observer 变化,好比这里的奶站是 Subject,是 1 的一方。用户时 Observer,是多的一方。

4 观察者模式解决天气预报需求

类图说明

代码实现

packagecom.lin.observer.plus;public interfaceSubject {voidregisterObserver(Observer o);voidremoveObserver(Observer o);voidnotifyObserver();

}

packagecom.lin.observer.plus;importjava.util.ArrayList;/** 类是核心 1. 包含最新的天气状况信息 2. 含有 CurrentConditions 对象 3. 当数据有更新时,就主动的调用

* CurrentConditions 对象 update 方法(含 display), 这样他们(接入方)就看到最新的信息*/

public class WeatherData implementsSubject{private floattemperatrue;private floatpressure;private floathumidity;private ArrayListobservers;//加入新的第三方

publicWeatherData() {

observers= new ArrayList();

}public floatgetTemperature() {returntemperatrue;

}public floatgetPressure() {returnpressure;

}public floatgetHumidity() {returnhumidity;

}public voiddataChange() {//调用 接入方的 update//currentConditions.update(getTemperature(), getPressure(), getHumidity());

notifyObserver();

}//当数据有更新时,就调用 setData

public void setData(float temperature, float pressure, floathumidity) {this.temperatrue =temperature;this.pressure =pressure;this.humidity =humidity;//调用 dataChange, 将最新的信息 推送给 接入方 currentConditions

dataChange();

}

@Overridepublic voidregisterObserver(Observer o) {

observers.add(o);

}

@Overridepublic voidremoveObserver(Observer o) {if(observers.contains(o)) {

observers.remove(o);

}

}

@Overridepublic voidnotifyObserver() {for (int i = 0; i < observers.size(); i++) {

observers.get(i).update(temperatrue, pressure, humidity);

}

}

}

packagecom.lin.observer.plus;public interfaceObserver {void update(float temperatrue, float pressure, floathumidity);

}

packagecom.lin.observer.plus;public class CurrentConditions implementsObserver{//温度,气压,湿度

private floattemperatrue;private floatpressure;private floathumidity;//更新天气状况

public void update(float temperature, float pressure, floathumidity) {this.temperatrue =temperature;this.pressure =pressure;this.humidity =humidity;

display();

}public voiddisplay(){

System.out.println("===Today's temperature: "+temperatrue+"===");

System.out.println("===Today's pressure: "+pressure+"===");

System.out.println("===Today's humidity: "+humidity+"===");

}

}

packagecom.lin.observer.plus;public class BaiDu implementsObserver{//温度,气压,湿度

private floattemperatrue;private floatpressure;private floathumidity;//更新天气状况

public void update(float temperature, float pressure, floathumidity) {this.temperatrue =temperature;this.pressure =pressure;this.humidity =humidity;

display();

}public voiddisplay() {

System.out.println("===BaiDu's temperature: " + temperatrue + "===");

System.out.println("===BaiDu's pressure: " + pressure + "===");

System.out.println("===BaiDu's humidity: " + humidity + "===");

}

}

packagecom.lin.observer.plus;public classClient {public static voidmain(String[] args) {//建立一个WeatherData

WeatherData weatherData = newWeatherData();//建立观察者

CurrentConditions currentConditions = newCurrentConditions();

BaiDu baiDu= newBaiDu();//注册

weatherData.registerObserver(currentConditions);

weatherData.registerObserver(baiDu);//测试

System.out.println("通知各个注册的观察者:");

weatherData.setData(23, 12, -0.4f);

}

}

观察者模式的好处

1) 观察者模式设计后,会以集合的方式来管理用户(Observer),包括注册,移除和通知。

2) 这样,咱们增长观察者(这里能够理解成一个新的公告板),就不须要去修改核心类 WeatherData 不会修改代码, 遵照了 ocp 原则。

5 观察者模式在 Jdk 应用的源码分析

1) Jdk 的 Observable 类就使用了观察者模式

2) 代码分析+模式角色分析

3) 模式角色分析

Observable 的做用和地位等价于 咱们前面讲过 Subject

Observable 是类,不是接口,类中已经实现了核心的方法 ,即管理 Observer 的方法 add.. delete .. notify...

Observer 的做用和地位等价于咱们前面讲过的 Observer, 有 update

Observable 和 Observer 的使用方法和前面讲过的同样,只是 Observable 是类,经过继承来实现观察者模式

仅供参考,有错误还请指出!

有什么想法,评论区留言,互相指教指教。

java观察者模式类图_设计模式(十八)——观察者模式(JDK Observable源码分析)...相关推荐

  1. 机票预定系统类图_电商系统延时任务机制源码分享

    需求分析: 在javashop电商系统中,各种促销活动都有开始时间和结束时间,想要让一个活动在预定的时间开始或结束,使用定时任务轮询,存在耗性能并且不能在准确的时间点开始或结束的缺点,为了可以在指定的 ...

  2. java tomcat源码_详解Tomcat系列(一)-从源码分析Tomcat的启动

    在整个Tomcat系列文章讲解之前, 我想说的是虽然整个Tomcat体系比较复杂, 但是Tomcat中的代码并不难读, 只要认真花点功夫, 一定能啃下来. 由于篇幅的原因, 很难把Tomcat所有的知 ...

  3. Java设计模式——工厂模式讲解以及在JDK中源码分析

    需求:便于手机种类的扩展 手机的种类很多(比如HuaWeiPhone.XiaoMiPhone等) 手机的制作有prepare,production, assemble, box 完成手机店订购功能. ...

  4. springboot 事务_原创002 | 搭上SpringBoot事务源码分析专车

    前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 专车介绍 该趟专车是开往Spring Boot事务源码分析的专车 专车问题 为什么 ...

  5. Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

    为什么80%的码农都做不了架构师?>>>    这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情.并发课题对于Java来说是一个又重要又难的一大块 ...

  6. 决策树(十)--GBDT及OpenCV源码分析

    一.原理 梯度提升树(GBT,Gradient Boosted Trees,或称为梯度提升决策树)算法是由Friedman于1999年首次完整的提出,该算法可以实现回归.分类和排序.GBT的优点是特征 ...

  7. 第十期-Linux内核补丁源码分析(2)

    作者:罗宇哲,中国科学院软件研究所智能软件研究中心 在上一期中,我们通过CAKE系统的实例介绍了一种对Linux内核补丁的初步分析方法,这一期我们将继续通过CAKE系统的例子介绍一种对补丁文件源码的分 ...

  8. java 计算器类图_多态计算器(封装、继承、多态、简单工厂)

    一.封装 向对象程序设计中,一个非常重要的技术便是封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.这样做的好处在于可以使类内部的具体 ...

  9. Java集合框架(十二):SortedMap 源码分析

    文章目录 1.SortedMap 简述 2.SortedMap 类图 3.SortedMap 方法说明 4.SortedMap 应用示例 4.1.SortedMap 构造函数示例 4.1.1.无参构造 ...

最新文章

  1. 这组动画完美演绎了一个程序员从接手新项目到交货的复杂心情
  2. MFC列表控件ListControl和树控件TreeControl
  3. 解决argo workflow报错:MountVolume.SetUp failed for volume “docker-sock“ : hostPath type check failed
  4. 突破C++瓶颈,在此一举!
  5. 【转】wordpress/wp-includes目录文件概述
  6. curl   liinux下http命令执行工具
  7. 算术编码(Arithmetic Coding)源代码
  8. 飞秋2010下载不仅野草是如此
  9. [HAOI2012]高速公路
  10. android释放全局变量,Android全局变量
  11. 关于项目中的封装、重构
  12. sql server 跨服务器查询数据
  13. KMP算法 AC自动机
  14. php 数据结构set,ES6的Set数据结构是什么
  15. 【IT基础】如何休息(每天都很累,但你真的会正确的休息方式么)
  16. 弥散张量分析开源软件 DSI Studio 简体中文汉化版可以下载了
  17. 如何去除word文档中向下的箭头
  18. 如何用hb制作一个html网页,HTML网页制作基础
  19. 【电源专题】脉宽调制(PWM)与脉冲频率调制(PFM)
  20. java学习(一)概述

热门文章

  1. R语言合并两个或多个有序数dataframe实战(dataframe的纵向合并):使用R原生方法、data.table、dplyr等方案
  2. R语言临床预测模型的评价指标与验证指标实战:C-index指标计算
  3. R可视化散点图并进行特殊目标样本点的标记
  4. 支持向量机SVM模型中C和gamma参数分别是什么?对模型有什么影响?
  5. 基于Keras Application和Densenet迁移学习(transfer learning)的乳腺癌图像分类模型(良性、恶性)
  6. matlab中的single是什么类型_MATLAB 中cell数据类型的使用方法
  7. java jar包搜索地址 and ADB 连接模拟器
  8. 四十而不惑——DNA测序技术的前世今生和未来
  9. makefile:2: *** missing separator. Stop. make 之后出现的错误,解决方法
  10. 医疗实体链接(标准化)论文解读 (附代码) A Lightweight Neural Model for Biomedical Entity Linking