当前位置: 首页 > news >正文

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.dtcms.com/a/363799.html

相关文章:

  • 代码随想录笔记-回溯算法
  • AI 写作实战:用 GPT-4o+ Claude 3 生成小红书文案,转化率提升 30%
  • 一文看懂 FastDatasets:用 LLM 极速生成高质量 SFT 数据集(已支持 Hugging Face Spaces PyPI)
  • maven私有仓库配置
  • 犀牛派A1上使用Faster Whisper完成音频转文字
  • 【Medical Image Analysis 1区TOP】用于MRI重建的全局感受野傅里叶卷积块
  • 《LINUX系统编程》笔记p8
  • FPGA时序约束(四)--主时钟约束
  • ESLint 相关
  • 算法模板(Java版)_前缀和与差分
  • 2025大学生必考互联网行业证书排名​
  • Git 代码提交管理指南
  • 【鸿蒙面试题-6】LazyForEach 懒加载
  • 单多行文本溢出
  • 大数据毕业设计选题推荐-基于大数据的大学生就业因素数据分析系统-Spark-Hadoop-Bigdata
  • 从0到1掌握进度管理:核心概念解析+目标设定的新手友好指南!
  • Elasticsearch常用DSL快速查询指南
  • Linux一共有多少个版本?
  • 基于SpringBoot2+Vue2开发的储物柜管理系统
  • 详解STM32的完整启动流程
  • Java流程控制04——if选择结构(本文为个人学习笔记,内容整理自哔哩哔哩UP主【遇见狂神说】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)
  • CentOS 7 服务器CPU突然飙升至100%?精准定位问题。
  • HBase Region
  • token存储方案
  • 告别传统照明!安科瑞 DALI 总线智能照明系统,解锁公建项目照明新体验
  • 机器人控制器开发(人形机器人产品设计)
  • 【C++模板】从起源到入门,小白必学泛型编程指南
  • 民间药方偏方网站整站源码 带数据PHP版
  • 【爬油管搜索视频软件】youtube爬虫工具,根据关键词采集搜到的视频数据
  • 分布式爬虫的全局请求间隔协调与IP轮换策略