欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > Java观察者模式详解

Java观察者模式详解

2025/6/22 2:53:42 来源:https://blog.csdn.net/cf535261933/article/details/148764764  浏览:    关键词:Java观察者模式详解

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象(主题)的状态发生改变时,所有依赖于它的对象(观察者)都会自动收到通知并更新。

核心概念

观察者模式包含以下核心角色:

  1. Subject(主题/被观察者)

    • 维护观察者列表
    • 提供注册、删除和通知观察者的接口
  2. ConcreteSubject(具体主题)

    • 实现Subject接口
    • 管理自身状态,并在状态变化时通知所有观察者
  3. Observer(观察者)

    • 定义更新接口,接收主题通知
  4. ConcreteObserver(具体观察者)

    • 实现Observer接口
    • 根据主题的状态变化执行具体操作

模式特点

  • 松耦合‌:主题和观察者之间松耦合
  • 自动通知‌:状态变化时自动通知观察者
  • 一对多‌:一个主题可对应多个观察者
  • 动态订阅‌:可动态添加/删除观察者

应用场景

观察者模式适用于以下场景:

  1. 消息发布/订阅系统‌:如聊天室、新闻推送
  2. 用户界面组件‌:GUI事件处理
  3. 实时数据监控‌:如股票价格变动、温度监控
  4. 事件驱动系统‌:如游戏引擎、企业监控系统
  5. 分布式系统‌:节点状态变更通知

代码实现示例

以下是观察者模式的基本实现(推模型):

// 观察者接口
public interface Observer {void update(String message);
}// 主题接口
public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}// 具体主题 - 新闻发布中心
public class NewsAgency implements Subject {private List<Observer> observers = new ArrayList<>();private String news;public void setNews(String news) {this.news = news;notifyObservers();}public void registerObserver(Observer o) {observers.add(o);}public void removeObserver(Observer o) {observers.remove(o);}public void notifyObservers() {for (Observer o : observers) {o.update(news);}}
}// 具体观察者 - 新闻订阅者
public class NewsSubscriber implements Observer {private String name;public NewsSubscriber(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " 收到新闻: " + message);}
}

通知模型对比

观察者模式有两种主要的通知模型:

模型类型数据传递方式优点缺点
推模型主题主动推送详细数据给观察者实时性强,响应快可能传递冗余数据
拉模型观察者收到通知后主动拉取数据按需获取,灵活性高增加主题的访问压力

Java内置支持

Java在java.util包中提供了观察者模式的实现:

  • Observable类(主题)
  • Observer接口

但自Java 9起已被标记为@Deprecated,推荐使用java.beans包中的PropertyChangeListenerPropertyChangeSupport

优缺点分析

优点‌:

  1. 主题和观察者之间松耦合
  2. 支持广播通信
  3. 符合开放-封闭原则
  4. 可动态添加/删除观察者

缺点‌:

  1. 通知顺序不可控
  2. 观察者过多时可能影响性能
  3. 可能导致循环依赖
  4. 观察者不知道彼此存在,可能导致更新冲突

实际应用案例

  1. 聊天系统‌:聊天室作为主题,用户作为观察者
  2. 温度监控系统‌:温度传感器作为主题,显示设备和报警系统作为观察者
  3. 彩票系统‌:彩票中心作为主题,购彩者作为观察者
  4. 企业监控系统‌:员工电脑作为主题,安全模块作为观察者

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词