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

(三)行为模式:7、观察者模式(Observer Pattern)(C++示例)

目录

1、观察者模式(Observer Pattern)含义

2、观察者模式的UML图学习

3、观察者模式的应用场景

4、观察者模式的优缺点

(1)优点:

(2)缺点

5、C++实现观察者模式的实例


1、观察者模式(Observer Pattern)含义

观察者模式(Observer)定义了一种一对多的依赖关系,让多个观察者对象同事监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。【DP】

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

2、观察者模式的UML图学习

观察者模式的主要角色包括:

(1)Subject(目标):被观察的对象,它维护了一个观察者列表,并提供了添加、删除和通知观察者的方法。

(2)Observer(观察者):观察目标的对象,它定义了接收通知并进行相应操作的方法。

(3)ConcreteSubject(具体目标):具体的被观察对象,继承或实现了Subject接口,可以有多个不同的具体目标。

(4)ConcreteObserver(具体观察者):具体的观察者对象,继承或实现了Observer接口,可以有多个不同的具体观察者。

3、观察者模式的应用场景

(1)当一个对象的改变需要同时通知其他对象,并且不知道具体有多少个对象需要通知时。

(2)当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中,使它们可以独立地改变和复用时。

4、观察者模式的优缺点

(1)优点:

        1)解耦性:观察者模式将目标和观察者解耦,使得它们可以独立地变化。

        2)扩展性:可以很方便地增加新的观察者和目标,符合开闭原则。

        3)可以实现一对多的依赖关系,一个目标可以有多个观察者。

(2)缺点

      1)观察者过多时,会导致通知时间增加,影响性能。

        2)观察者和目标之间有循环依赖时,可能会导致循环调用,需要注意避免。

5、C++实现观察者模式的实例


#include <iostream>
#include <vector>// 观察者接口
class Observer 
{
public:virtual void update(int data) = 0;
};// 具体观察者A
class ConcreteObserverA : public Observer 
{
public:void update(int data) override {std::cout << "ConcreteObserverA received update: " << data << std::endl;}
};// 具体观察者B
class ConcreteObserverB : public Observer 
{
public:void update(int data) override {std::cout << "ConcreteObserverB received update: " << data << std::endl;}
};// 目标类
class Subject 
{
private:int data;std::vector<Observer*> observers;public:void attach(Observer* observer) {observers.push_back(observer);}void detach(Observer* observer) {for (auto it = observers.begin(); it != observers.end(); ++it) {if (*it == observer) {observers.erase(it);break;}}}void notify() {for (auto observer : observers) {observer->update(data);}}void setData(int newData) {data = newData;notify();}
};int main() 
{Subject subject;ConcreteObserverA observerA;ConcreteObserverB observerB;subject.attach(&observerA);subject.attach(&observerB);subject.setData(10);subject.detach(&observerA);subject.setData(20);return 0;
}

在上述示例中,我们定义了Observer接口和两个具体观察者类ConcreteObserverA和ConcreteObserverB。Subject类作为目标类,维护了一个观察者列表,并提供了attach、detach和notify等方法。在主函数中,我们创建了一个Subject对象和两个具体观察者对象,并通过attach方法将它们注册到Subject中。然后,通过setData方法改变Subject的数据,从而触发通知并更新观察者。

相关文章:

(三)行为模式:7、观察者模式(Observer Pattern)(C++示例)

目录 1、观察者模式&#xff08;Observer Pattern&#xff09;含义 2、观察者模式的UML图学习 3、观察者模式的应用场景 4、观察者模式的优缺点 &#xff08;1&#xff09;优点&#xff1a; &#xff08;2&#xff09;缺点 5、C实现观察者模式的实例 1、观察者模式&…...

2019CVPR Semantic Graph Convolutional Networks for 3D Human Pose Regression

基于语义图卷积网络的三维人体姿态回归 源码 https://github.com/garyzhao/SemGCN 摘要 在本文中&#xff0c;我们研究了学习图卷积网络&#xff08;GCN&#xff09;回归的问题。GCN的当前体系结构受限于卷积滤波器和共享的变换矩阵为的小感受野。为了解决这些限制&#xff…...

大数据课程K16——Spark的梯度下降法

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解Spark的梯度下降法&#xff1b; ⚪ 了解Spark的梯度下降法家族&#xff08;BGD&#xff0c;SGD&#xff0c;MBGD&#xff09;&#xff1b; ⚪ 掌握Spark的MLlib实现…...

springboot:时间格式化的5种方法(解决后端传给前端的时间格式转换问题)推荐使用第4和第5种!

本文转载自&#xff1a;springboot&#xff1a;时间格式化的5种方法&#xff08;解决后端传给前端的时间显示不一致&#xff09;_为什么前端格式化日期了后端还要格式化_洛泞的博客-CSDN博客 时间问题演示 为了方便演示&#xff0c;我写了一个简单 Spring Boot 项目&#xff…...

六、vim编辑器的使用

1、编辑器 (1)编辑器就是一款软件。 (2)作用就是用来编辑文件&#xff0c;譬如编辑文字、编写代码。 (3)Windows中常用的编辑器&#xff0c;有自带的有记事本(notepad)&#xff0c;比较好用的notepad、VSCode等。 (4)Linux中常用的编辑器&#xff0c;自带的最古老的vi&…...

【易售小程序项目】项目介绍与系列文章集合

项目介绍 易售二手小程序主要用于校园中二手商品的交易&#xff0c;该系列文章会记录这个小程序前端的整个开发过程并提供详细代码&#xff0c;后台主要基于若依管理系统搭建&#xff0c;文章中也会提及后端关键部分的实现及代码。希望该系列文章可以帮助小白了解项目的开发流…...

游戏服务器成DDoS最大攻击重灾区

游戏产业的迅猛发展也让游戏产业成为被黑客攻击的重灾区。什么原因让游戏行业成为DDoS的攻击重点。总结有如下原因和主要手段&#xff1a; 1.游戏行业的攻击成本较低&#xff0c;攻防成本1&#xff1a;N。随着DDoS攻击的打法越来越复杂&#xff0c;攻击点更是越来越多&#xff…...

[SpringBoot3]博客管理系统(源码放评论区了)

八、博客管理系统 创建新的SpringBoot项目&#xff0c;综合运用以上知识点&#xff0c;做一个文章管理的后台应用。依赖&#xff1a; Spring WebLombokThymeleafMyBatis FrameworkMySQL DriverBean Validationhutool 需求&#xff1a;文章管理工作&#xff0c;发布新文章&…...

C语言——指针基本语法

概述 内存地址 在计算机内存中&#xff0c;每个存储单元都有一个唯一的地址(内存编号)。 通俗理解&#xff0c;内存就是房间&#xff0c;地址就是门牌号 指针和指针变量 指针&#xff08;Pointer&#xff09;是一种特殊的变量类型&#xff0c;它用于存储内存地址。 指针的实…...

elementui table 在浏览器分辨率变化的时候界面异常

异常点&#xff1a; 界面显示不完整&#xff0c;表格卡顿&#xff0c;界面已经刷新完成&#xff0c;但是表格的宽度还在一点一点变化&#xff0c;甚至有无线延伸的情况 思路&#xff1a; 1. 使用doLayout 这里官方文档有说明&#xff0c; 所以我的想法是&#xff0c;监听浏览…...

六、Kafka-Eagle监控

目录 6.1 MySQL 环境准备6.2 Kafka 环境准备6.3 Kafka-Eagle 安装 6.1 MySQL 环境准备 Kafka-Eagle 的安装依赖于 MySQL&#xff0c;MySQL 主要用来存储可视化展示的数据 6.2 Kafka 环境准备 修改/opt/module/kafka/bin/kafka-server-start.sh 命令 vim bin/kafka-server-sta…...

DBeaver 23.1.5 发布

导读DBeaver 是一个免费开源的通用数据库工具&#xff0c;适用于开发人员和数据库管理员。DBeaver 23.1.5 现已发布&#xff0c;更新内容如下. Data editor 重新设计了词典查看器面板 UI 空间数据类型&#xff1a;曲线几何线性化已修复 数据保存时结果选项卡关闭的问题已解决…...

三种垃圾收集算法,优缺点分析,设计垃圾收集

文章目录 垃圾收集算法标记-清除&#xff08;基础收集算法&#xff09;标记-复制&#xff08;新生代&#xff09;标记-整理&#xff08;老年代&#xff09; 垃圾收集算法 标记-清除&#xff08;基础收集算法&#xff09; 首先标记出所有需要回收的对象&#xff0c;在标记完成后…...

【链表OJ 10】环形链表Ⅱ(求入环节点)

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode142. 环形链表 II 1.问题描述 2.代码思路 3.问题分析 leetcode142. 环形链…...

RT-Thread在STM32硬件I2C的踩坑记录

RT-Thread在STM32硬件I2C的踩坑记录 0.前言一、软硬件I2C区别二、RT Thread中的I2C驱动三、尝试适配硬件I2C四、i2c-bit-ops操作函数替换五、Attention Please!六、总结 参考文章&#xff1a; 1.将硬件I2C巧妙地将“嫁接”到RTT原生的模拟I2C驱动框架 2.基于STM32F4平台的硬件I…...

小白学Go基础01-Go 语言的介绍

Go 语言对传统的面向对象开发进行了重新思考&#xff0c;并且提供了更高效的复用代码的手段。Go 语言还让用户能更高效地利用昂贵服务器上的所有核心&#xff0c;而且它编译大型项目的速度也很快。 用 Go 解决现代编程难题 Go 语言开发团队花了很长时间来解决当今软件开发人员…...

Spring工具类--Assert的使用

原文网址&#xff1a;Spring工具类--Assert的使用_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Spring的Assert工具类的用法。 Assert工具类的作用&#xff1a;判断某个字段&#xff0c;比如&#xff1a;断定它不是null&#xff0c;如果是null&#xff0c;则此工具类会报…...

无涯教程-Android - Absolute Layout函数

Absolute Layout 可让您指定其子级的确切位置(x/y坐标)&#xff0c;绝对布局的灵活性较差且难以维护。 Absolute Layout - 属性 以下是AbsoluteLayout特有的重要属性- Sr.NoAttribute & 描述1 android:id 这是唯一标识布局的ID。 2 android:layout_x 这指定视图的x坐标…...

2018ECCV Can 3D Pose be Learned from2D Projections Alone?

摘要 在计算机视觉中&#xff0c;从单个图像的三维姿态估计是一个具有挑战性的任务。我们提出了一种弱监督的方法来估计3D姿态点&#xff0c;仅给出2D姿态地标。我们的方法不需要2D和3D点之间的对应关系来建立明确的3D先验。我们利用一个对抗性的框架&#xff0c;强加在3D结构…...

干旱演变研究:定义及研究方法

在水文系统中,每个组分之间互相关联,包气带水、地下水和河川径流相互响应,水文循环处于动态平衡的状态。 降水作为水文系统的输入量,对水文循环具有重要的影响。降水短缺通过水文循环导致水文系统不同组分(包气带、地下水和地表水)发生干旱,降水不足导致土壤含水量减少,…...

消费级显卡轻松玩转百亿大模型微调?8步教你降维打击,显存成本打骨折!

本文介绍了如何使用QLoRA技术&#xff0c;仅需单张RTX 3090/4090显卡&#xff0c;即可高效微调百亿参数量级的大模型。文章详细阐述了从数据准备、模型加载与量化&#xff08;4-bit NF4&#xff09;、LoRA配置、训练优化&#xff08;混合精度、梯度累积等&#xff09;、模型评估…...

【2026年携程暑期实习- 3月29日-算法岗-第三题- 双门控序列加权器】(题目+思路+JavaC++Python解析+在线测试)

题目内容 在仅使用 n u m p y / p a n d a s / s c i k i t − l e a r n numpy/pandas/scikit-learn numpy/pandas/...

HZ-WAVES系列波浪传感器:解锁海洋数据采集的智能新方案

1. 海洋数据采集的痛点与智能化破局 海洋观测一直是科研和工程领域的硬骨头。记得我第一次参与海上作业时&#xff0c;传统波浪测量设备给我们带来了不少麻烦——笨重的机械结构、复杂的安装流程、动不动就罢工的电子元件&#xff0c;还有那让人头疼的数据传输延迟。最要命的是…...

Fun-Rec:从零到一构建推荐系统的完整学习路径

Fun-Rec&#xff1a;从零到一构建推荐系统的完整学习路径 【免费下载链接】fun-rec 推荐系统入门教程&#xff0c;在线阅读地址&#xff1a;https://datawhalechina.github.io/fun-rec/ 项目地址: https://gitcode.com/datawhalechina/fun-rec 当推荐系统成为互联网产品…...

大学物理(上)-期末实战解析(5)——刚体力学核心:从转动惯量到角动量守恒的解题秘籍

1. 刚体力学入门&#xff1a;为什么转动惯量是解题钥匙 刚体力学是大学物理中最让人头疼的章节之一&#xff0c;尤其是当题目里出现"转动惯量"这个名词时&#xff0c;很多同学就开始手心冒汗。记得我第一次做这类题目时&#xff0c;盯着那个积分符号看了半小时愣是没…...

ESLint-Plugin-React 终极配置指南:如何创建适合不同团队的个性化规则组合

ESLint-Plugin-React 终极配置指南&#xff1a;如何创建适合不同团队的个性化规则组合 【免费下载链接】eslint-plugin-react React-specific linting rules for ESLint 项目地址: https://gitcode.com/gh_mirrors/es/eslint-plugin-react ESLint-Plugin-React 是一个专…...

避坑指南:uniapp调用支付宝授权时常见的5个错误及解决方案

Uniapp支付宝授权实战&#xff1a;5个高频错误与深度解决方案 移动应用开发中&#xff0c;第三方授权登录是提升用户体验的关键环节。作为国内主流支付平台&#xff0c;支付宝授权在电商、生活服务类App中应用广泛。但许多Uniapp开发者在实现支付宝授权功能时&#xff0c;总会遇…...

从零构建:基于C语言的Modbus RTU从站驱动开发指南

1. Modbus RTU从站驱动开发入门指南 第一次接触Modbus RTU从站开发时&#xff0c;我完全被各种专业术语搞晕了。后来在工厂里调试一个温湿度传感器时&#xff0c;才真正理解这个协议的精妙之处——它就像车间里老师傅们约定俗成的对话方式&#xff0c;主设备问一句&#xff0c;…...

dll修复工具绿色版免安装,2026年最新版实测与风险提示

正急着用电脑&#xff0c;突然弹窗“缺少dll文件”&#xff0c;游戏或软件打不开。第一反应就是赶紧找个工具修好它&#xff0c;但又不想在电脑上装一堆乱七八糟的软件&#xff0c;就想找个绿色版、免安装的&#xff0c;用完就能删&#xff0c;不留痕迹。但网上这种小工具满天飞…...

开源DapFlash深度体验:除了下载程序,它的HEX编辑器还能帮你做什么?

开源DapFlash深度体验&#xff1a;HEX编辑器的隐藏技能树 当大多数嵌入式工程师将DapFlash视为又一个程序烧录工具时&#xff0c;它的HEX编辑器正在芯片深处执行着堪比"数字考古"的任务。上周在调试一款智能家居主控板时&#xff0c;我意外发现Bootloader区域被异常覆…...