news 2026/4/19 3:04:50

十九、观察者模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
十九、观察者模式
  • 目的: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  • 核心:主题(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 观察到目标已经更新了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 2:23:10

vue2+vue3 知识点讲解

目录 vue2 vue3 vue2 vue是什么&#xff1f;是一个用于构建用户界面的渐进式框架 创建实例&#xff1a;new Vue ( { el 指定挂载点&#xff0c;data 提供数据 } ) 插值表达式 {{ 表达式 }} 注意&#xff1a;不能在标签属性中使用 vue核心特性&#xff1a;响应式…

作者头像 李华
网站建设 2026/4/19 1:44:02

基于51单片机的煤气/天然气泄漏报警与排风系统 | 保姆式教程 开源可复刻

⚠️【高危安全强制警示】本项目涉及220V强电操作,绝对禁止带电接线、带电调试强电部分,所有强电接线必须在完全断电、确认无市电输入的状态下操作,建议由具备电工资质的专业人员完成强电回路接线,必须做好双重绝缘防护与短路保护,杜绝触电、火灾、爆炸等安全隐患。本内容…

作者头像 李华
网站建设 2026/4/17 16:20:11

从零到一:LVGL 9.0在Linux桌面环境下的移植与SDL图形界面实战

1. LVGL 9.0与Linux桌面环境适配基础 LVGL&#xff08;Light and Versatile Graphics Library&#xff09;作为嵌入式领域最受欢迎的轻量级图形库之一&#xff0c;其9.0版本带来了更强大的渲染性能和模块化架构。在Linux桌面环境下搭建SDL模拟器&#xff0c;相当于为嵌入式UI开…

作者头像 李华