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

观察者设计模式

观察者模式用于建立对象间一对多的依赖关系。当一个对象(主题)状态改变时,所有依赖它的对象(观察者)都会自动收到通知并更新。

核心组件
  1. 主题 (Subject)
    维护观察者列表,提供注册/注销方法,通知观察者状态变化

    import java.util.ArrayList;
    import java.util.List;public abstract class Subject {private List<Observer> observers = new ArrayList<>();public void attach(Observer o) {observers.add(o);}public void detach(Observer o) {observers.remove(o);}public void notifyObservers() {for (Observer o : observers) {o.update();}}
    }
    

  2. 观察者 (Observer)
    定义更新接口,接收主题通知

    public interface Observer {void update();
    }
    

具体实现示例

主题实现类

public class ConcreteSubject extends Subject {private int state;public int getState() {return state;}public void setState(int state) {this.state = state;notifyObservers();  // 状态变化时通知观察者}
}

观察者实现类

public class ConcreteObserver implements Observer {private String name;private ConcreteSubject subject;public ConcreteObserver(String name, ConcreteSubject subject) {this.name = name;this.subject = subject;subject.attach(this);  // 自动注册到主题}@Overridepublic void update() {System.out.println(name + " 收到更新: 状态值 = " + subject.getState());}
}

使用示例
public class Client {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();new ConcreteObserver("观察者A", subject);new ConcreteObserver("观察者B", subject);subject.setState(10);  // 触发通知subject.setState(20);  // 再次触发通知}
}

输出结果
观察者A 收到更新: 状态值 = 10
观察者B 收到更新: 状态值 = 10
观察者A 收到更新: 状态值 = 20
观察者B 收到更新: 状态值 = 20

模式优势
  1. 松耦合:主题无需知道观察者的具体实现
  2. 动态关系:可随时添加/删除观察者
  3. 广播通信:一次状态变化可通知多个对象
  4. 符合开闭原则:新增观察者无需修改主题代码
典型应用场景
  • GUI 事件处理(如按钮点击)
  • 消息订阅系统
  • 股票价格变动通知
  • 游戏中的成就系统
  • 分布式系统的状态同步

注意:Java 内置 java.util.ObservableObserver 接口已过时(Java 9+),推荐使用自定义实现或 java.beans.PropertyChangeListener 替代。

http://www.xdnf.cn/news/15686.html

相关文章:

  • 微服务引擎 MSE 及云原生 API 网关 2025 年 5 月产品动态
  • PXE实现Ubuntu,rockylinux,almalinux全自动安装
  • 第五届计算机科学与区块链国际学术会议(CCSB 2025)
  • MEF 在 WPF 中的简单应用
  • 多人协作游戏中,团队共同获取的装备如何确定按份共有或共同共有
  • 基于Llama的RAG 3种模型配置方法
  • Django REST Framework 入门指南:从 0 到 1 实现 RESTful API
  • Linux-局域网构建+VLAN 划分 + 端口 MAC-IP 绑定 + 静态 DHCP
  • Python 进阶学习之全栈开发学习路线
  • 如何删除 VSCode 账号的远程同步备份记录数据
  • 如何使用VScode使用ssh连接远程服务器不需要输入密码直接登录
  • 信息收集知识总结
  • LabVIEW液压机智能监控
  • gem install报错解析
  • 【C# in .NET】11. 探秘泛型:类型参数化革命
  • JAVA面试宝典 -《分布式ID生成器:Snowflake优化变种》
  • 基于CentOS的分布式GitLab+Jenkins+Docker架构:企业级CI/CD流水线实战全记录
  • 基于 Spring Boot 构建的文件摆渡系统(File Ferry System)
  • 更灵活方便的初始化、清除方法——fixture【pytest】
  • AWS WebRTC 并发 Viewer 拉流失败分析:0.3 秒等待为何如此关键?
  • 消息转换器--通过此工具进行时间转换
  • Mybatis-2快速入门
  • 【WRFDA数据教程第一期】LITTLE_R 格式详细介绍
  • 【源力觉醒 创作者计划】百度携文心 4.5 入局,开源大模型市场再添一员猛将,与 Qwen3 对比如何?
  • 3DGS之COLMAP
  • iOS 抓包工具选择与配置指南 从零基础到高效调试的完整流程
  • Android动态获取当前应用占用的内存PSS,Java
  • 汽车功能安全-相关项集成和测试(系统集成测试系统合格性测试)-12
  • 从电子管到CPU
  • 迁移学习的概念和案例