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

详细讲解什么是观察者模式

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

该模式主要涉及两种角色:

  1. 主题(Subject): 也称为被观察者或可观察对象,是目标对象。它包含一系列观察者,并提供方法来添加、删除观察者以及通知观察者的操作。

  2. 观察者(Observer): 也称为订阅者,它定义了一个更新的接口,用于主题在状态发生变化时通知观察者。

        观察者模式的核心思想是解除主题和观察者之间的耦合关系,使得它们可以独立变化。当主题的状态发生变化时,所有的观察者都能够及时得到通知,并进行相应的处理。

        下面是一个简单的观察者模式的例子,假设我们有一个气象站,它可以实时测量温度,并通知多个观察者:

import java.util.ArrayList;
import java.util.List;// 主题接口
interface Subject {void addObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();
}// 观察者接口
interface Observer {void update(float temperature);
}// 具体主题
class WeatherStation implements Subject {private List<Observer> observers = new ArrayList<>();private float temperature;public void setTemperature(float temperature) {this.temperature = temperature;notifyObservers();}@Overridepublic void addObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(temperature);}}
}// 具体观察者
class Display implements Observer {private float temperature;@Overridepublic void update(float temperature) {this.temperature = temperature;display();}public void display() {System.out.println("Current Temperature: " + temperature);}
}// 客户端
public class Client {public static void main(String[] args) {WeatherStation weatherStation = new WeatherStation();Display display1 = new Display();Display display2 = new Display();weatherStation.addObserver(display1);weatherStation.addObserver(display2);// 模拟温度变化weatherStation.setTemperature(25.5f);weatherStation.setTemperature(28.0f);}
}

        在这个例子中,WeatherStation 是具体主题,实现了 Subject 接口。Display 是具体观察者,实现了 Observer 接口。客户端通过调用 addObserver 方法将观察者注册到主题中,然后通过 setTemperature 方法模拟温度的变化,观察者会收到通知并更新自己的状态。

http://www.lryc.cn/news/236820.html

相关文章:

  • 镭速,克服UDP传输缺点的百倍提速传输软件工具
  • Semi-Supervised Multi-Modal Learning with Balanced Spectral Decomposition
  • 3296:【例50.2】 计算书费《信息学奥赛一本通编程启蒙(C++版)》
  • 统一身份认证平台之SSO建设
  • 【开题报告】基于SpringBoot的膳食营养健康网站的设计与实现
  • 超五类网线和六类网线的相同点和区别
  • Linux--初识和基本的指令(1)
  • 万宾科技智能井盖传感器,提升市政井盖健康
  • transformer学习资料
  • 一起学docker系列之四docker的常用命令--系统操作docker命令及镜像命令
  • MySQL 的执行原理(三)
  • 一道好题——分治
  • 庖丁解牛:NIO核心概念与机制详解 02 _ 缓冲区的细节实现
  • Python itertools模块中的combinations() 函数用法
  • 在线预览excel,luckysheet在vue项目中的使用
  • 【python】OpenCV—Image Pyramid(8)
  • vue3父组件提交校验多个子组件
  • 系统移植-uboot
  • 使用FFmpeg合并多个ts视频文件转为mp4格式
  • 大模型之十二十-中英双语开源大语言模型选型
  • .Net6 部署到IIS示例
  • 轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码
  • JS 日期格式化
  • 右键菜单和弹出菜单的区别
  • 查询数据库DQL
  • SpringBoot中文乱码问题解决方案
  • 京东联盟flutter插件使用方法
  • python电影数据可视化分析系统的设计与实现【附源码】
  • SQLMAP --TAMPER的编写
  • 美国服务器:全面剖析其主要优点与潜在缺点