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

十九、观察者模式

  • 目的: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  • 核心:主题(Subject/Observable)维护观察者列表,提供注册、注销和通知方法。观察者(Observer)实现更新接口。主题状态改变时,调用所有注册观察者的更新方法。
  • 场景:常用于实现事件处理系统,如GUI组件的事件监听、股票价格变动通知等,当状态改变时自动通知所有订阅者。

首先是观察者接口,定义更新方法

packageobserver;publicinterfaceIWatcher{voidupdate();}

与一个具体观察类

packageobserver;publicclassUpdateWatcherimplementsIWatcher{@Overridepublicvoidupdate(){// 当被观察对象发生变化时,此方法会被调用System.out.println(this+" 观察到目标已经更新了。");}}

然后有一个被观察者接口(也称主题接口 Subject)

packageobserver;publicinterfaceIWathedSubject{voidadd(IWatcherwatcher);// 添加观察者voidremove(IWatcherwatcher);// 移除观察者voidupdate();// 更新主题状态voidnotifyWatchers();// 通知所有观察者}

与具体被观察者类

packageobserver;importjava.util.ArrayList;importjava.util.List;publicclassUpdateWatchedSubjectimplementsIWathedSubject{privateList<IWatcher>list;// 存储观察者列表publicUpdateWatchedSubject(){this.list=newArrayList<>();// 初始化观察者列表}@Overridepublicvoidadd(IWatcherwatcher){// 添加新的观察者this.list.add(watcher);}@Overridepublicvoidremove(IWatcherwatcher){// 移除指定的观察者this.list.remove(watcher);}@Overridepublicvoidupdate(){// 主题状态发生变化时调用System.out.println("目标主题状态已更新...");// 职责分离 状态变更的预处理notifyWatchers();// 纯粹执行观察者通知}@OverridepublicvoidnotifyWatchers(){// 纯粹执行 通知观察者for(IWatcherwatcher:list){// 遍历观察者列表watcher.update();// 调用每个观察者的反应方法}}}

最后是函数入口

packageobserver;publicclassMainTest{publicstaticvoidmain(String[]args){//自定义观察者模式IWathedSubjectwatched=newUpdateWatchedSubject();//创建主题watched.add(newUpdateWatcher());//创建三个观察者watched.add(newUpdateWatcher());watched.add(newUpdateWatcher());watched.update();//主题状态变化 通知每个观察者System.out.println();}}

终端输出

目标主题状态已更新... observer.observer.UpdateWatcher@4aa298b7 观察到目标已经更新了。 observer.observer.UpdateWatcher@7d4991ad 观察到目标已经更新了。 observer.observer.UpdateWatcher@28d93b30 观察到目标已经更新了。

http://www.jsqmd.com/news/656265/

相关文章:

  • 保姆级教程:在Ubuntu 22.04上从零部署Picovoice离线语音助手(含树莓派兼容指南)
  • Comsol新手必看:5步搞定CPU水冷散热系统仿真(附模型文件下载)
  • R语言实战:用microeco和meconetcomp包5分钟搞定微生物网络稳定性分析(附完整代码)
  • 不只是降噪:聊聊声加ENC算法在TWS耳机通话中的AEC与ANC联动
  • Arduino ESP32终极开发指南:从零开始打造物联网项目
  • 如果 Seedance 3.0 真把长视频 + 多语言口型同步 + 低成本做起来,广告和短剧团队可能会先挨刀
  • 手绘白板终极指南:5个实用技巧让你快速掌握Excalidraw虚拟画布
  • Ubuntu 24.04 安装 OpenClaw + 微信对话框控制(官方ClawBot,合规无封号)
  • TMS320F28377S开发实战:在CCS9.3中同时玩转库函数与寄存器编程(附工程模板)
  • MySQL SQL优化快速入门
  • Captain AI功能价值矩阵——解锁增长密码的三把钥匙
  • 嵌入式开发避坑指南:在ARM板子上交叉编译并运行stressapptest测试DDR
  • 约翰斯·霍普金斯大学让大模型挑战真实法律推理,结果令人警醒
  • 【仅剩72小时开放】:2026奇点大会AI结构生成沙盒环境限时开放!手把手带你用自然语言“写”出可部署的时序索引结构(含GPT-5 Schema Agent演示)
  • ESP32智能家居实战:用巴法云+微信小程序,做一个能远程开关的智能灯(附完整代码)
  • NR/5G - 从波束赋形到系统消息:SSB/SIB1/SI/Paging调度全链路解析
  • 小程序如何提高复购率?
  • 跨平台Git图形化客户端:为什么SourceGit成为开发者的新宠
  • ESP-BLE-MESH配网日志全解析:从Provisioner广播到Node配置完成的每一步
  • Windy网站数据源全景解析:从ECMWF到闪电网络
  • 别再只用query传参了!微信小程序EventChannel传大数据的保姆级教程
  • 告别Shell脚本地狱:用Nextflow重构你的生信分析流程(附入门实战代码)
  • AI 聊天流式交互基础:SSE、EventSource 与 ReadableStream
  • 小程序如何提升转化率?
  • GitLab集成企业自研OAuth2单点登录:从配置到避坑全指南
  • 目前口碑好的不锈钢网篮销售厂家 - 小张小张111
  • 深入ZStack OSAL:手把手解析任务调度与事件处理机制(以ZStack 2.5.1a为例)
  • 在西铁城走心机上,如何有效处理细长轴件的振动与变形问题?
  • 不只是安装:Modelsim SE 10.4a 安装后的第一件事——工程创建与仿真环境快速上手
  • 上下文窗口超载,语义漂移加剧,API契约断裂——长代码生成失败的3大根源,及NASA级验证的4层加固方案