【设计模式-观察者模式】

定义

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

UML图

在这里插入图片描述

  • Subject(主题/被观察者):定义了可以注册、注销观察者的方法,以及通知观察者的逻辑。
  • Observer(观察者):定义了一个更新接口,当被观察者状态发生变化时,观察者会通过该接口更新自己。
  • ConcreteSubject(具体主题):实现主题接口,维护观察者的列表,并在状态变化时通知观察者。
  • ConcreteObserver(具体观察者):实现观察者接口,定义在主题状态变化时的具体行为。

工作流程

  1. 观察者通过主题对象注册自己,以便接收更新。
  2. 主题对象在状态变化时调用观察者的更新方法。
  3. 观察者根据主题的最新状态进行相应的更新操作。

代码

import java.util.ArrayList;
import java.util.List;// 观察者接口
interface Observer {void update(String message);
}// 主题接口
interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();
}// 具体主题类
class NewsAgency implements Subject {private List<Observer> observers = new ArrayList<>();private String news;public void registerObserver(Observer observer) {observers.add(observer);}public void removeObserver(Observer observer) {observers.remove(observer);}public void notifyObservers() {for (Observer observer : observers) {observer.update(news);}}public void setNews(String news) {this.news = news;notifyObservers(); // 状态变化时通知所有观察者}
}// 具体观察者类
class NewsChannel implements Observer {private String name;public NewsChannel(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received news update: " + message);}
}// 测试观察者模式
public class ObserverPatternDemo {public static void main(String[] args) {NewsAgency newsAgency = new NewsAgency();NewsChannel channel1 = new NewsChannel("Channel 1");NewsChannel channel2 = new NewsChannel("Channel 2");newsAgency.registerObserver(channel1);newsAgency.registerObserver(channel2);newsAgency.setNews("Breaking News: Observer Pattern Explained!");newsAgency.setNews("More News: Observer Pattern in Action!");}
}

优点

  • 解耦:观察者和主题之间的耦合度低,主题不需要了解观察者的具体实现。
  • 动态添加观察者:可以在运行时动态地添加和移除观察者,灵活性高。
  • 广播机制:一个主题可以有多个观察者,状态变化时可以一并通知所有观察者。

缺点

  • 可能导致内存泄漏:如果观察者没有被正确注销,可能会造成内存泄漏。
  • 通知顺序不确定:多个观察者的更新顺序不固定,可能会导致状态不一致。
  • 复杂性增加:在复杂系统中,观察者和主题之间的关系可能变得难以管理和调试。

适用场景

  • 事件处理系统:如 GUI 事件监听,用户操作触发相应的事件。
  • 发布/订阅系统:如消息队列、社交媒体的通知系统等。
  • 数据变化监测:如实时数据监控、股票价格更新等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149705.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

从更底层的角度理解网站的访问过程

文章目录 1.示例&#xff0c;访问www.baidu.com是如何返回数据的1.输入www.baidu.com回车2.检查本机的C:\Windows\System32\drivers\etc\hosts配置文件夹下有没有这个域名对应的映射&#xff1a; 1.示例&#xff0c;访问www.baidu.com是如何返回数据的 1.输入www.baidu.com回车…

C++之STL—stack栈 queue队列

栈stack&#xff0c;先进后出 * 入栈 --- push * 出栈 --- pop * 返回栈顶 --- top * 判断栈是否为空 --- empty * 返回栈大小 --- size 队列queue&#xff0c;先进先出 - 入队 --- push - 出队 --- pop - 返回队头元素 --- front - 返回队尾元素 --- back -…

EasyCVR全方位安全守护智慧电厂:构建高效视频监控系统优势分析

随着信息技术的飞速发展和数字化时代的到来&#xff0c;电厂作为能源供应的重要枢纽&#xff0c;其安全性和管理效率成为社会各界关注的焦点。为了满足电厂对高效、智能、可靠视频监控系统的需求&#xff0c;基于EasyCVR平台建设的电厂视频监控系统应运而生。 一、系统构成 基…

每日论文1——应用于65nm CMOS锁相环完全电流匹配的电荷泵

《A Charge Pump with Perfect Current Matching Applied to Phase-Locked Loop in 65nm CMOS》2021 IEEE 14th International Conference on ASIC 电荷泵PLL的结构框图如图&#xff0c;其中CP的充放电电流不匹配会引起PLL的频率误差和杂散。 传统的电荷泵结构在输出处的电平…

【关联规则Apriori】【算法】【商务智能方法与应用】课程

探索Apriori算法&#xff1a;数据挖掘中的频繁项集与关联规则 在当今数据驱动的世界中&#xff0c;数据挖掘技术正变得越来越重要。今天&#xff0c;我们将通过一个实际案例&#xff0c;了解并应用Apriori算法&#xff0c;这是一种广泛用于发现频繁项集及其关联规则的算法&…

适合二开的web组态软件

技术文档 官网网站&#xff1a;http://www.hcy-soft.com 体验地址&#xff1a;by组态[web组态插件] 可以广泛应用于化工、石化、制药、冶金、建材、市政、环保、电力等几十个行业。 一、产品简介 BY组态是完全自主研发的集实时数据展示、动态交互等一体的全功能可视化平台。帮…

LeetCode 每日一题 ---- 【2207. 字符串中最多数目的子序列】

LeetCode 每日一题 ---- 【2207. 字符串中最多数目的子序列】 2207.字符串中最多数目的子序列方法&#xff1a;贪心 一次遍历 2207.字符串中最多数目的子序列 方法&#xff1a;贪心 一次遍历 从题意中可以看出来&#xff0c;对于 pattern.charAt(0) 一定是插入到最左侧是最优…

记一次Mac 匪夷所思终端常用网络命令恢复记录

一天莫名奇妙发现ping dig 等基础命令都无法正常使用。还好能浏览器能正常访问&#xff0c;&#xff0c;&#xff0c;&#xff0c; 赶紧拿baidu试试^-^ ; <<>> DiG 9.10.6 <<>> baidu.com ;; global options: cmd ;; connection timed out; no serve…

Mysql——初识Mysql

目录 数据库基础 创建数据库 服务器&#xff0c;数据库&#xff0c;表关系 数据逻辑存储 MySQL架构 SQL分类 存储引擎 mysql服务端是一个网络服务器&#xff0c;采用的是TCP协议在应用层 &#xff0c;mysql有自己的协议。 数据库基础 mysql不是数据库&#xff0c;是mysql的…

信息安全工程师(16)密码学概况

前言 密码学是研究编制密码和破译密码的技术科学&#xff0c;它涵盖了加密技术和解密技术的各个方面&#xff0c;是现代信息安全的核心组成部分。 一、定义与基本概念 定义&#xff1a;密码学是研究如何隐密地传递信息的学科&#xff0c;主要涉及保密通信和数字签名两个方面。它…

【工具】语音朗读PDF的免费工具

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 背景介绍 看累了&#xff0c;不想看&#xff0c;能不能读给我听&#xff01; 工具介绍 Natural Readers Free Text to Speech Online with Realistic…

Ubuntu 16.04安装填坑记录

一. 问题描述&#xff1a; &#xff08;1&#xff09;Ubuntu 16.04使用USB启动盘安装时&#xff0c;出现"try ubuntu without installation"或“install ubuntu”选择&#xff0c;Enter选择安装后&#xff0c;显示器黑屏无任何显示。 原因分析&#xff1a; 显示黑…

Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类

引言 本文基于Python仿真的电能质量扰动信号&#xff0c;先经过数据预处理进行数据集的制作和加载&#xff0c;然后通过Pytorch实现LSTM模型对扰动信号的分类。Python仿真电能质量扰动信号的详细介绍可以参考下文&#xff08;文末附10分类数据集&#xff09;&#xff1a; Pyth…

8.11Zero Crossing Detection (零交叉检测)

基本概念 零交叉检测是一种基于二阶导数的边缘检测方法&#xff0c;它通过查找二阶导数过零点来定位边缘。 注意: OpenCV没有直接提供这种检测方法&#xff0c;但可以通过结合其他函数来实现。 在OpenCV中&#xff0c;基于C的Zero Crossing Detection&#xff08;零交叉检测&…

项目第一弹:RabbitMQ介绍

RabbitMQ介绍 一、前言1. 回顾生产者消费者模型2.忙闲不均与负载均衡3.改造线程池使其支持负载均衡4.MQ的引入 二、MQ的介绍1.应用/模块解耦&#xff0c;且提高容错性2.异步处理3.流量削峰填谷4.分布式事务1.两阶段提交协议&#xff08;2PC协议&#xff09;2.事务消息&#xff…

《动手学深度学习》笔记2.1——神经网络从基础→进阶 (层和块 - 自定义块)

目录 0. 前言 原书正文&#xff08;第五章&#xff09; 第五章 - 第一节 - 层和块 - 自定义块 1. Sequential() PyTorch高级API 2. MLP() 无传入参数 3. MySequential() 传入任意层(块) 4. FixedHiddenMLP() 无传入参数-固定隐藏层 5. NestMLP() 传入嵌套块-多次嵌套 …

【目标检测】隐翅虫数据集386张VOC+YOLO

隐翅虫数据集&#xff1a;图片来自网页爬虫&#xff0c;删除重复项后整理标注而成 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;386 标注…

C++核心编程和桌面应用开发 第五天(new delete malloc 静态成员 静态成员函数 单例)

目录 1.new运算符 1.1开批数组 2.delete运算符 3.malloc和new的区别 4.万能指针接收new对象 5.静态成员 6.静态成员函数 7. 单例 7.1概念 7.2常见场景 1.new运算符 C中用new进行动态内存分配&#xff0c;new会在调用构造函数之前&#xff0c;成功进行内存分配&#x…

利用F.interpolate()函数进行插值操作

函数简介 功能&#xff1a; 利用插值方法&#xff0c;对输入的张量数组进行上\下采样操作&#xff0c;换句话说就是科学合理地改变数组的尺寸大小&#xff0c;尽量保持数据完整。 torch.nn.functional.interpolate(input, sizeNone, scale_factorNone, modenearest, align_c…

RabbitMQ是什么?RabbitMQ简介

一&#xff1a;技术背景 假如我们有一个支付服务&#xff0c;支付服务的业务逻辑是&#xff1a;首先支付扣减余额&#xff0c;更新支付单状态&#xff0c;更新订单状态&#xff0c;发短信&#xff0c;给这个用户增加积分。在这个场景下&#xff0c;如果我们使用同步调用通信&am…