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

23种设计模式-行为型模式之观察者模式(Java版本)

Java 观察者模式(Observer Pattern)详解

🧠 什么是观察者模式?

观察者模式是一种行为型设计模式,定义对象之间的一种一对多的依赖关系,使得每当一个对象状态发生变化时,所有依赖它的对象都会得到通知并自动更新。


🎯 使用场景

  • 一个对象状态的变化需要通知多个对象
  • 系统中存在一对多的依赖关系
  • 实现事件处理系统(如GUI、订阅/发布)

🏗️ 模式结构

  • Subject(主题):被观察的对象,提供注册和移除观察者的方法
  • Observer(观察者):定义响应更新的方法
  • ConcreteSubject / ConcreteObserver:具体实现类

✅ 示例:天气预报系统

观察者接口(Observer)

public interface Observer {void update(float temperature, float humidity, float pressure);
}

主题接口(Subject)

public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}

具体主题类

import java.util.ArrayList;
import java.util.List;public class WeatherData implements Subject {private List<Observer> observers = new ArrayList<>();private float temperature;private float humidity;private float pressure;@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for (Observer o : observers) {o.update(temperature, humidity, pressure);}}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;notifyObservers();}
}

具体观察者类

public class CurrentConditionsDisplay implements Observer {private float temperature;private float humidity;@Overridepublic void update(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;display();}public void display() {System.out.println("当前温度:" + temperature + "℃,湿度:" + humidity + "%");}
}

客户端调用

public class WeatherStation {public static void main(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionsDisplay display = new CurrentConditionsDisplay();weatherData.registerObserver(display);weatherData.setMeasurements(26.5f, 65.0f, 1013.0f);}
}

✅ 优点

  • 降低耦合性,实现松散耦合的通知机制
  • 易于添加新观察者,符合开闭原则

⚠️ 缺点

  • 观察者太多时通知会影响性能
  • 通知链可能较复杂,调试困难

🧩 使用建议

适合构建事件驱动系统、发布订阅模型,也广泛应用于GUI框架、MVC架构中。

相关文章:

  • 零基础上手Python数据分析 (24):Scikit-learn 机器学习初步 - 让数据预测未来!
  • stm32L4R5ZI Nucleo-144 GPIO点灯及按键中断
  • Log4j Properties 配置项详细说明
  • linux socket编程之tcp(实现客户端和服务端消息的发送和接收)
  • C盘爆红如何解决
  • 如何使用WebRTC
  • [FPGA Video IP] Video Processing Subsystem
  • 【分布式系统中的“瑞士军刀”_ Zookeeper】二、Zookeeper 核心功能深度剖析与技术实现细节
  • Deep Reinforcement learning for real autonomous mobile robot navigation
  • FreeBSD可以不经过windows服务器访问windows机器上的共享文件吗?
  • deepseek-cli开源的强大命令行界面,用于与 DeepSeek 的 AI 模型进行交互
  • JAVA后端开发常用的LINUX命令总结
  • 模板引擎语法-过滤器
  • Spring进阶篇
  • Github 2025-04-26 Rust开源项目日报Top10
  • 自动化测试实战篇
  • SVN 安装指南
  • WebAssembly全栈革命:在Rust与JavaScript之间构建高性能桥梁
  • ARM架构的微控制器总线矩阵
  • k8s学习记录(四):节点亲和性
  • 程璧“自由生长”,刘卓辉“被旋律牵着走”
  • 首映|《人生开门红》:段子背后都是案子
  • 建投读书会·东西汇流|全球物品:跨文化交流视域下的明清外销瓷
  • 专访|攸佳宁:手机只是矛盾导火索,重要的是看见孩子的内心
  • 与包乐史驾帆航行|航海、钓鱼和写书:一个记者的再就业之路
  • 最高法:学校未及时发现并制止校园暴力行为,需承担侵权责任