DP-观察者模式代码详解

观察者模式: 定义一系列对象之间的一对多关系;当一个对象改变状态,它的依赖都会被通知。 主要由主题(Subject)和观察者(Observer)组成。

代码实现

package com.designpatterns.observer;/*** 定义主题接口*/
public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}
/*** 定义观察者接口*/
public interface Observer {public void update(float temp,float humidity,float pressure);//当主题状态变更时,被调用
}
package com.designpatterns.observer;/*** 定义天气情况显示的元素接口*/
public interface DisplayElement {public void display();
}
package com.designpatterns.observer;import java.util.ArrayList;
import java.util.List;/*** 具体主题的实现*/
public class WeatherDataConcretSubject implements  Subject{private List<Observer> observers;private float temperature;private  float humidity;private float pressure;public WeatherDataConcretSubject(){observers=new ArrayList<>();}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(temperature,humidity,pressure);  //观察者更新天气数据}}public void measurementsChanged(){notifyObservers();//当测量到新的天气数据,通知观察者}/*** 设置天气测试数据* @param temperature* @param humidity* @param pressure*/public void setMeasurements(float temperature,float humidity,float pressure){this.temperature=temperature;this.humidity=humidity;this.pressure=pressure;measurementsChanged();}}

package com.designpatterns.observer;/**** 具体每个观察者实现。每个观察着注册具体主题以接口更新*** 显示当前的天气情况***/
public class CurrentConditionsDisplay implements Observer, DisplayElement{private float temperature;private float humidity;private WeatherDataConcretSubject weatherDataConcretSubject;public CurrentConditionsDisplay(WeatherDataConcretSubject weatherDataConcretSubject){this.weatherDataConcretSubject=weatherDataConcretSubject;weatherDataConcretSubject.registerObserver(this);}@Overridepublic void update(float temp, float humidity, float pressure) {this.temperature=temp;this.humidity=humidity;display();}@Overridepublic void display() {System.out.println("Current conditions:"+temperature+"F degrees and "+ humidity+"% humidity ");}
}
package com.designpatterns.observer;public class ForecastDisplay implements  Observer,DisplayElement{private float temperature;private float humidity;private WeatherDataConcretSubject weatherDataConcretSubject;public ForecastDisplay(WeatherDataConcretSubject weatherDataConcretSubject){this.weatherDataConcretSubject=weatherDataConcretSubject;weatherDataConcretSubject.registerObserver(this);}@Overridepublic void display() {//显示预报的天气System.out.println("ForecastDisplay:"+temperature+"F degrees and "+ humidity+"% humidity ");}@Overridepublic void update(float temp, float humidity, float pressure) {this.temperature=temp;this.humidity=humidity;display();}
}
package com.designpatterns.observer;public class StatisticsDisplay implements Observer,DisplayElement{private float temperature;private float humidity;private WeatherDataConcretSubject weatherDataConcretSubject;public StatisticsDisplay(WeatherDataConcretSubject weatherDataConcretSubject){this.weatherDataConcretSubject=weatherDataConcretSubject;weatherDataConcretSubject.registerObserver(this);}@Overridepublic void update(float temp, float humidity, float pressure) {this.temperature=temp;this.humidity=humidity;display();}@Overridepublic void display() {//显示测量的avg,min,max值System.out.println("StatisticsDisplay:"+temperature+"F degrees and "+ humidity+"% humidity ");}
}
package com.designpatterns.observer;/*** 观察者模式测试*/
public class WeatherStationTest {public static void main(String[] args) {WeatherDataConcretSubject weatherDataConcretSubject=new WeatherDataConcretSubject();CurrentConditionsDisplay currentConditionsDisplay=new CurrentConditionsDisplay(weatherDataConcretSubject);StatisticsDisplay statisticsDisplay=new StatisticsDisplay(weatherDataConcretSubject);ForecastDisplay forecastDisplay=new ForecastDisplay(weatherDataConcretSubject);//设置模拟的气象数据weatherDataConcretSubject.setMeasurements(80,65,30.4f);weatherDataConcretSubject.setMeasurements(82,70,29.2f);weatherDataConcretSubject.setMeasurements(78,90,29.2f);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95760.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1983:ARPANET向互联网的转变

一、ARPANET早期1969年诞生的ARPANET最初还算不上互联网&#xff0c;不过在ARPANET构建之初就已经考虑了分组交换&#xff1a;1970年代的ARPANET:其实这个时候我就有疑问&#xff0c;TCP/IP是1983年1月1日更新到ARPANET的&#xff0c;但是1970年代的ARPANET已经连接全美的重要单…

自动化运维-ansible中的变量运用

自动化运维-ansible中的变量运用 一、变量命名规则 组成&#xff1a;字母、数字、下划线。必须以字母开头。 合法: app_port, web_1, varA非法: 2_var (以数字开头), my-var (包含其他字符), _private (以下划线开头) 避免使用内置关键字&#xff1a;例如 hosts, tasks, name…

深入学习并发编程中的volatile

volatile 的作用 保证变量的内存可见性禁止指令重排序1.保证此变量对所有的线程的可见性&#xff0c;当一个线程修改了这个变量的值&#xff0c;volatile 保证了新值能立即同步到主内存&#xff0c;其它线程每次使用前立即从主内存刷新。 但普通变量做不到这点&#xff0c;普通…

使用Java获取本地PDF文件并解析数据

获取本地文件夹下的PDF文件要获取本地文件夹下的PDF文件&#xff0c;可以使用Java的File类和FilenameFilter接口。以下是一个示例代码片段&#xff1a;import java.io.File; import java.io.FilenameFilter;public class PDFFileFinder {public static void main(String[] args…

吴恩达机器学习补充:决策树和随机森林

数据集&#xff1a;通过网盘分享的文件&#xff1a;sonar-all-data.csv 链接: https://pan.baidu.com/s/1D3vbcnd6j424iAwssYzDeQ?pwd12gr 提取码: 12gr 学习来源&#xff1a;https://github.com/cabin-w/MLBeginnerHub 文末有完整代码&#xff0c;由于这里的代码和之前的按…

Shell脚本一键监控平台到期时间并钉钉告警推送指定人

1. 监控需求客户侧有很多平台需要定期授权&#xff0c;授权后管理后台才可正常登录&#xff0c;为避免授权到期&#xff0c;现撰写脚本自动化监控平台授权到期时间&#xff0c;在到期前15天钉钉或其他媒介提醒。2. 监控方案2.1 收集平台信息梳理需要监控的平台地址信息&#xf…

华为HCIE数通含金量所剩无几?考试难度加大?

最近网上很火的一个梗——法拉利老了还是法拉利&#xff0c;这句话套在华为HCIE数通身上同样适用&#xff0c;华为认证中的华为数通和云计算两大巨头充斥着大家的视野里面&#xff0c;也更加广为人知&#xff0c;但随着时代的发展&#xff0c;华为认证体系的调整&#xff0c;大…

#数据结构----2.1线性表

在数据结构的学习中&#xff0c;线性表是最基础、最核心的结构之一 —— 它是后续栈、队列、链表等复杂结构的 “基石”。今天从 “是什么”&#xff08;定义&#xff09;到 “怎么用”&#xff08;基本操作&#xff09;&#xff0c;彻底搞懂线性表的核心逻辑。 一、先明确&…

2508C++,skia动画

gif动画原理 先了解一下gif动画的原理: gif动画由一系列静态图像(或叫帧)组成.这些图像按特定的顺序排列,每一帧都代表动画中的一个瞬间,帧图像是支持透明的. 每两帧之间有指定的时间间隔(一般小于60毫秒),gif播放器每渲染一帧静态图像后,即等待此时间间隔,依此逻辑不断循环渲染…

AI + 机器人:当大语言模型赋予机械 “思考能力”,未来工厂将迎来怎样变革?

一、引言1.1 未来工厂变革背景与趋势在科技飞速发展的当下&#xff0c;全球制造业正站在变革的十字路口。随着消费者需求日益多样化、市场竞争愈发激烈&#xff0c;传统工厂模式的弊端逐渐显现。生产效率低下、难以适应个性化定制需求、设备维护成本高昂且缺乏前瞻性等问题&…

pinia状态管理的作用和意义

1. 什么是状态管理 状态管理就是统一管理应用中的数据&#xff0c;让数据在多个组件之间共享和同步。 // 没有状态管理 - 数据分散在各个组件中 // 组件A const user ref({ name: 张三, age: 25 })// 组件B const user ref({ name: 张三, age: 25 }) // 重复定义// 组件C c…

十四、STM32-----低功耗

一、电源框图VDDA 供电区域&#xff0c;主要是 ADC 电源以及参考电压&#xff0c;STM32 的 ADC 模块配备独立的供电方 式&#xff0c;使用了 VDDA 引脚作为输入&#xff0c;使用 VSSA 引脚作为独立地连接&#xff0c;VREF 引脚为提供给 ADC 的 参考电压。电压调节器是 STM32 的…

一篇文章带你彻底搞懂 JVM 垃圾收集器

垃圾收集器是 JVM 内存管理的执行引擎&#xff0c;负责自动回收无用的对象内存。其设计核心是 权衡&#xff1a;主要是吞吐量和停顿时间之间的权衡。没有“最好”的收集器&#xff0c;只有“最适合”特定场景的收集器。一、核心基础&#xff1a;分代收集模型主流 HotSpot JVM 采…

服务器排故随笔:服务器无法ssh远程登录

文章目录服务器排故随笔&#xff1a;服务器无法远程登录问题现象解决过程第一步&#xff1a;确认故障描述是否准确第二步&#xff1a;确认网络是否有问题第三步&#xff1a;确认ssh服务是否有问题第四步&#xff1a;确认防火墙是否放行sshd服务第五步&#xff1a;试试万能的“重…

Deeplizard深度学习课程(六)—— 结合Tensorboard进行结果分析

前言 Tensorboard最初是tensorflow的可视化工具&#xff0c;被用于机器学习实验的可视化&#xff0c;后来也适配了pytorch。Tensorboard是一个前端web界面&#xff0c;&#xff0c;能够从文件里面读取数据并展示它&#xff08;比如损失、准确率、网络图&#xff09;。具体使用可…

C语言————实战项目“扫雷游戏”(完整代码)

无论是找工作面试&#xff0c;还是课设大作业、考研&#xff0c;都离不开实战项目的积累&#xff0c;如果你能把一个项目搞明白&#xff0c;并且给别人熟练的讲出来&#xff0c;即使你没有过项目经历&#xff0c;也可以说是非常加分的&#xff0c;下面来沉浸式体验一下这款扫雷…

数据结构之加餐篇 -顺序表和链表加餐

目录一、链表分割二、随机链表的复制总结一、链表分割 链表分割 题目描述的意思就如下图&#xff1a; 也就是把1&#xff0c;2挪到前面&#xff0c;6&#xff0c;3&#xff0c;5挪到后面&#xff0c;前者的相对顺序不发生改变 这里要想往后挪就要先遍历&#xff0c;遍历到6…

JSP与Servlet整合数据库开发:构建Java Web应用的全栈指南

JSP与Servlet整合数据库开发&#xff1a;构建Java Web应用的全栈指南 概述 在Java Web开发领域&#xff0c;JSP&#xff08;JavaServer Pages&#xff09;与Servlet是构建动态Web应用的核心技术组合。Servlet作为Java EE的基础组件&#xff0c;负责处理客户端请求、执行业务逻…

设计五种算法精确的身份证号匹配

问题定义与数据准备 我们有两个Excel文件&#xff1a; small.xlsx: 包含约5,000条记录。large.xlsx: 包含约140,000条记录。 目标&#xff1a;快速、高效地从large.xlsx中找出所有其“身份证号”字段存在于small.xlsx“身份证号”字段中的记录&#xff0c;并将这些匹配的记录保…

Spring 框架(IoC、AOP、Spring Boot) 的必会知识点汇总

目录&#xff1a;&#x1f9e0; 一、Spring 框架概述1. Spring 的核心功能2. Spring 模块化结构&#x1f9e9; 二、IoC&#xff08;控制反转&#xff09;核心知识点1. IoC 的核心思想2. Bean 的定义与管理3. IoC 容器的核心接口4. Spring Bean 的创建方式&#x1f9f1; 三、AOP…