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

[行为型模式]观察者模式

  • 手机观察者:PhoneDisplay
  • 平板观察者:TabletDisplay
  • 电脑观察者:ComputerDisplay

每个观察者都实现相同的接口 Observer,但具有不同的显示逻辑。


🧱 示例结构

类名类型功能描述
Subject接口定义注册、移除和通知方法
WeatherData具体主题维护观察者并发送更新通知
Observer接口定义观察者的更新行为
PhoneDisplay观察者手机端展示天气信息
TabletDisplay观察者平板端展示天气信息
ComputerDisplay观察者电脑端展示天气信息

🔧 接口定义(不变)

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;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList<>();}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(temperature, humidity, pressure);}}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;notifyObservers();}
}

🏗️ 多个观察者实现

1. 手机观察者 PhoneDisplay

public class PhoneDisplay implements Observer {private float temperature;private float humidity;private Subject weatherData;public PhoneDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}@Overridepublic void update(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;display();}public void display() {System.out.println("[手机] 当前天气: 温度=" + temperature + "°C, 湿度=" + humidity + "%");}
}

2. 平板观察者 TabletDisplay

public class TabletDisplay implements Observer {private float temperature;private float humidity;private Subject weatherData;public TabletDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}@Overridepublic void update(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;display();}public void display() {System.out.println("[平板] 实时气象数据 - 温度:" + temperature + "°C,湿度:" + humidity + "%");}
}

3. 电脑观察者 ComputerDisplay

public class ComputerDisplay implements Observer {private float temperature;private float humidity;private float pressure;private Subject weatherData;public ComputerDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}@Overridepublic void update(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;display();}public void display() {System.out.println("[电脑] 天气详情:温度=" + temperature + "°C,湿度=" + humidity + "%,气压=" + pressure + "hPa");}
}

🧪 测试客户端代码

public class Client {public static void main(String[] args) {WeatherData weatherData = new WeatherData();// 注册三个不同设备的观察者PhoneDisplay phone = new PhoneDisplay(weatherData);TabletDisplay tablet = new TabletDisplay(weatherData);ComputerDisplay computer = new ComputerDisplay(weatherData);// 模拟数据变化System.out.println("第一次更新数据:");weatherData.setMeasurements(25, 65, 1013);System.out.println("\n第二次更新数据:");weatherData.setMeasurements(27, 70, 1012);}
}

✅ 输出结果示例

第一次更新数据:
[手机] 当前天气: 温度=25.0°C, 湿度=65.0%
[平板] 实时气象数据 - 温度:25.0°C,湿度:65.0%
[电脑] 天气详情:温度=25.0°C,湿度=65.0%,气压=1013.0hPa第二次更新数据:
[手机] 当前天气: 温度=27.0°C, 湿度=70.0%
[平板] 实时气象数据 - 温度:27.0°C,湿度:70.0%
[电脑] 天气详情:温度=27.0°C,湿度=70.0%,气压=1012.0hPa

📌 总结

通过引入多个观察者(如手机、平板、电脑),我们展示了观察者模式的灵活性与解耦能力。每个观察者都可以根据自身需求独立处理更新内容,而无需关心数据是如何产生的。

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

相关文章:

  • 【苍穹外卖项目】Day01
  • Django(自用)
  • Redis:渐进式遍历
  • ArkUI-X构建Android平台AAR及使用
  • ROS2 工作空间中, CMakeLists.txt, setup.py和 package.xml的作用分别是?
  • 【编译原理】题目合集(一)
  • 初识MySQL · 事务 · 下
  • TCP/IP 网络编程 | Reactor事件处理模式
  • 像素跟踪 跟踪像素 算法总结
  • 【慧游鲁博】【12】小程序端 · 智能导览对接后端文物图片识别功能
  • WEB JWT
  • java复习 09
  • 【开源工具】:基于PyQt5的智能网络驱动器映射工具开发全流程(附源码)
  • WWDC 2025 开发者特辑 | 肘子的 Swift 周报 #088
  • 计算机视觉之三维重建(深入浅出SfM与SLAM核心算法)—— 1. 摄像机几何
  • 2025最新软件测试八股文,查漏补缺(含答案+文档)
  • Spring Cloud Gateway 介绍
  • 离线部署openstack 2024.1 neutron
  • 离线部署openstack 2024.1 keystone
  • AI Agent 的架构与技术体系分析
  • 新能源知识库(40)一个省的综合电价由哪些因素决定?
  • C++ call_once用法
  • 基础知识:抽象类成员变量的继承与使用
  • Web APIS Day04
  • BlogX项目数据库读写分离AI面试题
  • 海外打车代驾app多语言切换模块设计
  • CentOs7.x系列IP地址由动态改静态(解决远程连接掉线问题)
  • 字符串|数组|计算常见函数整理-竞赛专用(从比赛真题中总结的,持续更新中)
  • 7.Vue的compute计算属性
  • atomicity of memory accesses