讲师中心 微信公众号
AI工具推荐 视频效率加速

如何理解Java中的观察者模式

夜宇姑娘_7445

夜宇姑娘_7445

发布时间:2025-09-22 17:45:01

|

298人浏览过

|

来源于php中文网

原创

观察者模式通过被观察者状态变化时自动通知所有依赖的观察者实现一对多更新,常用于事件处理、GUI交互与数据同步;核心为Subject维护Observer列表并触发update方法,Java中可通过自定义接口或过时的Observable类实现,适用于解耦事件源与处理逻辑,需注意性能与内存泄漏问题。

如何理解java中的观察者模式

观察者模式是一种行为设计模式,用于在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知并更新。在Java中,这种模式广泛应用于事件处理机制、GUI组件交互以及数据模型与视图之间的同步等场景。

核心角色:被观察者与观察者

观察者模式包含两个主要角色:

  • 被观察者(Subject):也叫主题或可观察对象,它维护一个观察者列表,并提供添加、删除和通知观察者的方法。
  • 观察者(Observer):实现统一接口的对象,它们关注被观察者的状态变化,并在接收到通知后执行相应逻辑。

当被观察者内部状态发生变化时,它会主动调用所有注册观察者的更新方法,从而实现自动通知。

Java中的实现方式

你可以通过自定义接口来实现观察者模式,也可以使用Java内置的支持。

立即学习“Java免费学习笔记(深入)”;

1. 自定义实现:

定义一个观察者接口:

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
interface Observer {
    void update(String message);
}

被观察者类维护观察者列表并实现管理与通知逻辑:

class Subject {
    private List<Observer> observers = new ArrayList<>();
    private String state;

    public void setState(String state) {
        this.state = state;
        notifyObservers();
    }

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    private void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }
}
2. 使用Java内置类:

Java提供了

java.util.Observable
类和
java.util.Observer
接口,但要注意从Java 9开始,
Observable
已被标记为过时,不推荐在新项目中使用。

典型应用场景

观察者模式适用于需要解耦事件源与事件处理逻辑的场合。

  • 消息订阅系统:用户订阅某个主题,主题更新时所有订阅者收到通知。
  • MVVM 或 MVC 架构中,模型变化通知视图刷新。
  • GUI事件监听,如按钮点击、窗口关闭等,背后就是观察者模式的体现。

优点与注意事项

该模式的优点在于松耦合:被观察者无需了解观察者的具体实现,只需保证通知接口一致即可。新增观察者不影响原有逻辑,符合开闭原则。

但也需注意:

  • 若观察者过多或更新操作耗时,可能影响性能。
  • 要防止内存泄漏,及时移除不再需要的观察者。
  • 避免在通知过程中修改观察者列表,可能导致并发问题。

基本上就这些。理解观察者模式的关键是掌握“状态变化-自动通知-批量更新”这一流程,它让对象间的通信更灵活、可扩展。虽然Java内置支持已过时,但其思想仍在现代框架中广泛应用,比如Spring的事件监听机制。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2391

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

437

2026.01.26

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3088

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4589

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3729

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

426

2026.01.19

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

120

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

100

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn