java观察者模式类图_设计模式(十八)——观察者模式(JDK Observable源码分析)...
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源码分析)...相关推荐
- 机票预定系统类图_电商系统延时任务机制源码分享
需求分析: 在javashop电商系统中,各种促销活动都有开始时间和结束时间,想要让一个活动在预定的时间开始或结束,使用定时任务轮询,存在耗性能并且不能在准确的时间点开始或结束的缺点,为了可以在指定的 ...
- java tomcat源码_详解Tomcat系列(一)-从源码分析Tomcat的启动
在整个Tomcat系列文章讲解之前, 我想说的是虽然整个Tomcat体系比较复杂, 但是Tomcat中的代码并不难读, 只要认真花点功夫, 一定能啃下来. 由于篇幅的原因, 很难把Tomcat所有的知 ...
- Java设计模式——工厂模式讲解以及在JDK中源码分析
需求:便于手机种类的扩展 手机的种类很多(比如HuaWeiPhone.XiaoMiPhone等) 手机的制作有prepare,production, assemble, box 完成手机店订购功能. ...
- springboot 事务_原创002 | 搭上SpringBoot事务源码分析专车
前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 专车介绍 该趟专车是开往Spring Boot事务源码分析的专车 专车问题 为什么 ...
- Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)
为什么80%的码农都做不了架构师?>>> 这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情.并发课题对于Java来说是一个又重要又难的一大块 ...
- 决策树(十)--GBDT及OpenCV源码分析
一.原理 梯度提升树(GBT,Gradient Boosted Trees,或称为梯度提升决策树)算法是由Friedman于1999年首次完整的提出,该算法可以实现回归.分类和排序.GBT的优点是特征 ...
- 第十期-Linux内核补丁源码分析(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心 在上一期中,我们通过CAKE系统的实例介绍了一种对Linux内核补丁的初步分析方法,这一期我们将继续通过CAKE系统的例子介绍一种对补丁文件源码的分 ...
- java 计算器类图_多态计算器(封装、继承、多态、简单工厂)
一.封装 向对象程序设计中,一个非常重要的技术便是封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.这样做的好处在于可以使类内部的具体 ...
- Java集合框架(十二):SortedMap 源码分析
文章目录 1.SortedMap 简述 2.SortedMap 类图 3.SortedMap 方法说明 4.SortedMap 应用示例 4.1.SortedMap 构造函数示例 4.1.1.无参构造 ...
最新文章
- 这组动画完美演绎了一个程序员从接手新项目到交货的复杂心情
- MFC列表控件ListControl和树控件TreeControl
- 解决argo workflow报错:MountVolume.SetUp failed for volume “docker-sock“ : hostPath type check failed
- 突破C++瓶颈,在此一举!
- 【转】wordpress/wp-includes目录文件概述
- curl liinux下http命令执行工具
- 算术编码(Arithmetic Coding)源代码
- 飞秋2010下载不仅野草是如此
- [HAOI2012]高速公路
- android释放全局变量,Android全局变量
- 关于项目中的封装、重构
- sql server 跨服务器查询数据
- KMP算法 AC自动机
- php 数据结构set,ES6的Set数据结构是什么
- 【IT基础】如何休息(每天都很累,但你真的会正确的休息方式么)
- 弥散张量分析开源软件 DSI Studio 简体中文汉化版可以下载了
- 如何去除word文档中向下的箭头
- 如何用hb制作一个html网页,HTML网页制作基础
- 【电源专题】脉宽调制(PWM)与脉冲频率调制(PFM)
- java学习(一)概述
热门文章
- R语言合并两个或多个有序数dataframe实战(dataframe的纵向合并):使用R原生方法、data.table、dplyr等方案
- R语言临床预测模型的评价指标与验证指标实战:C-index指标计算
- R可视化散点图并进行特殊目标样本点的标记
- 支持向量机SVM模型中C和gamma参数分别是什么?对模型有什么影响?
- 基于Keras Application和Densenet迁移学习(transfer learning)的乳腺癌图像分类模型(良性、恶性)
- matlab中的single是什么类型_MATLAB 中cell数据类型的使用方法
- java jar包搜索地址 and ADB 连接模拟器
- 四十而不惑——DNA测序技术的前世今生和未来
- makefile:2: *** missing separator. Stop. make 之后出现的错误,解决方法
- 医疗实体链接(标准化)论文解读 (附代码) A Lightweight Neural Model for Biomedical Entity Linking