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

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架构中。

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

相关文章:

  • 理想星环OS选择NuttX作为MCU侧OS的核心原因分析​
  • 树莓派学习专题<9>:使用V4L2驱动获取摄像头数据--设定分辨率和帧率
  • ASP.NET CORE部署IIS的三种方式
  • 第14节:传统图像特征提取 - 形状特征(HOG、SIFT与SURF)
  • 【fork初体验】
  • 数据结构手撕--【堆】
  • 【LeetCode】11.盛最多水的容器
  • 系列位置效应——AI与思维模型【80】
  • 鸿蒙代码@Builder
  • 关于调度策略的系统性解析与物流机器人应用实践
  • Universal Value Function Approximators 论文阅读(强化学习,迁移?)
  • 介绍常用的退烧与消炎药
  • 【Flume 】Windows安装步骤、配置环境
  • Llama factory如何全参数微调 Qwen2.5-7B-Instruct 模型并导入Ollama推理(详细版)
  • 大一下第一次考核题解
  • Linux文件目录操作实战
  • 【C++】15. 模板进阶
  • 【含文档+PPT+源码】基于Python的美食数据的设计与实现
  • llama factory 命令行推理流程
  • MUC基本知识
  • 电子电器架构 --- 乘用车电气/电子架构开发的关键挑战与应对策略
  • Shell编程之正则表达式
  • c++弹窗
  • threejs 零基础学习day01
  • 【补题】Codeforces Global Round 20 F1. Array Shuffling
  • Python循环中断:break和continue,循环else语法,综合案例
  • 一、人类社会结构的根本逻辑
  • Cribl 上传lookup 表,传入数据进event
  • 计算机网络的五层结构(物理层、数据链路层、网络层、传输层、应用层)到底是什么?
  • 揭开人工智能的神秘面纱:从概念到人工神经网络