观察者模式-C++

观察者模式(Observer)是一种行为型设计模式,它用于在对象之间建立一对多的依赖关系,当一个对象发生改变时,所有依赖它的对象都会收到通知进行相应的改变。

观察者模式中有两种核心角色:

  • 观察者(Observer):也被称为订阅者或监听者,观察者通过注册到特定的主题上,当主题的状态发生改变时,它可以收到这种变化更新自身状态。观察者定义了一个统一的接口,使得主题可以通过接口将通知发送给所有的观察者。
  • 主题(Subject):也称为被观察者,它管理着一组观察者对象,提供添加、删除观察者对象的方法。当主题发生改变的时候可以将通知发送给所有的观察者对象。

在这里面,观察者依赖主题,所以一个主题可以对应多个观察者。

观察者模式的流程:

  • 主题对象管理观察者对象的添加和删除
  • 主题对象维护一个观察者对象的列表,用于记录所有注册的观察者对象
  • 当主题对象的状态发生改变时,遍历观察者列表,将通知发送给每一个观察者对象
  • 观察者对象收到通知后更新自身的状态

观察者模式也有三个组件:观察者接口、观察者、主题

举例:
假设现在我们有一个电子商务平台,当用户下单之后我们希望通知库存系统和用户通知系统。

现在我们按照观察者模式的三个组件来编写代码:观察者接口、观察者、主题

// 观察者接口
class IObserver
{
public:virtual ~IObserver(){}virtual void Update(const std::string& _msg) = 0;
};// 观察者-库存系统
class InventorySystem: public IObserver
{
public:virtual void Update(const std::string& _msg) override{std::cout << "库存系统:" << _msg << std::endl;}
};// 观察者-用户通知系统
class UserNotifySystem: public IObserver
{
public:virtual void Update(const std::string& _msg) override{std::cout << "用户通知系统:" << _msg << std::endl;}
};// 主题
class Subject
{
public:// 添加观察者对象void AddObserver(std::shared_ptr<IObserver> _observer){if (_observer)observers_.push_back(_observer);}// 删除观察者对象void RemoveObserver(std::shared_ptr<IObserver> _observer){for (auto it = observers_.begin(); it != observers_.end();){if (*it == _observer)it = observers_.erase(it);elseit++;}}// 用户下单void UserPlatform(const std::string& _msg){std::cout << "用户下单:" << _msg << std::endl;NotifyAllObserver(_msg);}private:// 通知所有的观察者对象void NotifyAllObserver(const std::string _msg){for (auto it : observers_)it->Update(_msg);}private:// 记录所有注册的观察者对象std::list<std::shared_ptr<IObserver>> observers_;
};

在main.cpp里使用它:

void TestObserver()
{// 主题对象std::shared_ptr<Subject> subject = std::make_shared<Subject>();// 观察者对象-库存系统std::shared_ptr<IObserver> inventory_system = std::make_shared<InventorySystem>();// 观察者对象-用户通知系统std::shared_ptr<IObserver> user_notify = std::make_shared<UserNotifySystem>();// 注册观察者subject->AddObserver(inventory_system);subject->AddObserver(user_notify);// 用户下单subject->UserPlatform("iphone 11");std::cout << "---------------------删除 用户通知系统------------------" << std::endl;// 删除观察者subject->RemoveObserver(user_notify);// 用户下单subject->UserPlatform("小米 11");
}int main()
{// 策略模式用法// TestStrategy();TestObserver();system("pause");return 0;
}

输出:
在这里插入图片描述优点:

  • 松耦合:主题和观察者之间是松耦合的,修改一个观察者对象不影响其他对象
  • 可扩展:可以在任何时候添加和删除观察者,无需修改已有代码
  • 即时通知:一旦主题发生改变,观察者可以立即收到通知。

适用场景:

  • 当一个对象发生改变时,希望主动通知其他对象而不是其他对象等待通知时
  • 当具有一对多的关系时,一个对象的更新会影响到其他对象时

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eNSP-打开华为USG6000V1防火墙web管理页面方法

一、本地打开防火墙web管理页面 1.先在ensp中启动USG6000V1防火墙&#xff0c;启动后&#xff0c;需要输入原始username和password&#xff08;username&#xff1a;admin&#xff0c;password&#xff1a;Admin123&#xff09;&#xff0c;并修改原始密码后&#xff0c;才能配…

TiDB单机集群模拟生产环境

1、先部署环境&#xff0c;安装5.4.3版本&#xff0c;详细的安装步骤见官方文档&#xff1a;单机集群模拟生产环境安装教程 配置文件topo.yaml global:user: "tidb"ssh_port: 22deploy_dir: "/tidb-deploy"data_dir: "/tidb-data"monitored:no…

XML Web 服务 Eclipse实现中的sun-jaxws.xml文件

说明 在sun-jaxws.xml文件&#xff0c;可以配置endpoint、handler-chain等内容。在这个文件中配置的内容会覆盖在Java代码中使用注解属性配置的的内容。 这个文件根据自己的项目内容修改完成以后&#xff0c;作为web应用的一部分部署到web容器中&#xff08;放到web应用的WEB…

Python使用SQLAlchemy操作sqlite

Python使用SQLAlchemy操作sqlite sqllite1. SQLite的简介2. 在 Windows 上安装 SQLite3. 使用SQLite创建数据库3.1 命令行创建数据库3.2 navicat连接数据库 4.sqlite的数据类型存储类SQLite Affinity 类型Boolean 数据类型Date 与 Time 数据类型 5. 常用的sql语法**创建表(CREA…

七个开源免费的低代码/无代码后端项目

无代码/低代码系统是一种用于支持开发人员在不编写代码的情况下构建应用程序或者管理数据库的平台或工具。这类系统提供了可视化界面和预构建组件&#xff0c;使开发人员能够设计和创建API、管理数据和配置应用程序逻辑&#xff0c;无需进行传统模式的编程。 基于无代码后端的…

Ubuntu(WSL2) mysql8.0.31 源码安装

要在 Ubuntu 上使用调试功能安装 MySQL 8.0 的源码&#xff0c;可以按照以下详细步骤进行操作&#xff1a; 1. 更新系统 首先&#xff0c;确保你的 Ubuntu 系统是最新的。运行以下命令更新系统软件包&#xff1a; sudo apt update sudo apt upgrade 2. 下载 MySQL 源码 访…

自律性差怎么办,如何提高自律能力?

自律的力量是强大的&#xff0c;当然一个人不自律也没啥大不了的事&#xff0c;毕竟不自律的人才是大多数&#xff0c;但是当你想要有所成就的时候&#xff0c;那你就必须要学会自律&#xff0c;提高自律。 如果一个人缺乏自律性&#xff0c;那么学生时代肯定成绩不稳定&#…

使用jmeter进行简单压力测试

前言 最近项目要上线,需要项目进行简单的压力测试,本次使用的是jmeter来进行的,由于本人不是专业测试,只是对本次使用过程进行简单的记录. 一.jemeter的下载与安装 我这个已经安装很久了,具体过程这个可以查询下其他博客(偷个懒). 二.使用过程 1.测试计划右击-添加(add)-线…

适用于WPF的设计模式

适用于WPF的设计模式 讨论“XAML能不能写逻辑代码”这个问题。我发现这是个有歧义的问题。这个问题可以有两种意思&#xff1a; XAML能不能用来写逻辑代码&#xff1f; XAML文件里能不能包含逻辑代码&#xff1f; 对于第一种意思——XAML是一种声明性语言&#xff0c;就是用来…

物联网AI MicroPython学习之语法 umqtt客户端

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; umqtt 介绍 模块功能: MQTT客户端功能 - 连线、断线、发布消息、订阅主题、KeepAlive等功能。 MQTT协议采用订阅者/发布者模式&#xff0c;协议中定义了消息服务质量&#xff08;Quality of Service&#x…

HackTheBox-Starting Point--Tier 2---Vaccine

文章目录 一 Vaccine 测试过程1.1 打点1.1.1 FTP匿名登录1.1.2 SQL注入 1.2 权限提升 二 题目 一 Vaccine 测试过程 1.1 打点 1.端口扫描 nmap -sV -sC 10.129.191.631.1.1 FTP匿名登录 2.FTP允许匿名登录&#xff0c;发现backup.zip ftp 10.129.191.63解压backup.zip&#x…

03-学成在线内容管理模块之课程查询

课程查询 需求分析 教学机构人员点击课程管理按钮进入课程查询界面,在课程列表页面输入查询条件查询课程的信息 当不输入查询条件时默认会全部课程信息,输入查询条件会查询符合条件的课程信息,约束条件是本教学机构查询本机构的课程信息 数据模型(model工程) 课程查询功能…

一文看懂香港优才计划和高才通计划的区别和优势?如何选?

一文看懂香港优才计划和高才通计划的区别和优势&#xff1f;如何选&#xff1f; 为什么很多人都渴望有个香港身份&#xff1f; 英文这里和内地文化相近&#xff0c;语言相通&#xff0c;同时税率较低、没有外汇管制&#xff0c;有稳定金融体制和良好的营商环境&#xff0c;诸多…

9种高效提速的transformer魔改版本

Transformer目前已经成为人工智能领域的主流模型&#xff0c;应用非常广泛。然而Transformer中注意力机制计算代价较高&#xff0c;随着序列长度的增加&#xff0c;这个计算量还会持续上升。 为了解决这个问题&#xff0c;业内出现了许多Transformer的魔改工作&#xff0c;以优…

互联网医院系统|互联网医院提高医疗资源的利用效率

越来越多患者掌握更多医疗知识并开始积极参与医疗决策过程。他们主动问诊&#xff0c;并开始明确表达治疗和支付方案偏好。同时&#xff0c;互联网医院、视频问诊、远程会诊等技术创新使线上问诊、多学科诊疗等新型医疗服务模式更加可及&#xff0c;互联网医院系统实际上与医院…

css3 初步了解

1、css3的含义及简介 简而言之&#xff0c;css3 就是 css的最新标准&#xff0c;使用css3都要遵循这个标准&#xff0c;CSS3 已完全向后兼容&#xff0c;所以你就不必改变现有的设计&#xff0c; 2、一些比较重要的css3 模块 选择器 1、标签选择器&#xff0c;也称为元素选择…

竞赛选题 深度学习的动物识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

使用select实现定时任务

selectOutOfTime.c里边的代码如下&#xff1a; #include<stdio.h> #include<sys/time.h> #include<sys/types.h> #include<unistd.h> #include <string.h>#define BUF_SIZE 100int main(void){fd_set reads;struct timeval tv;int errorNum;cha…

STM32H750之FreeRTOS学习--------(六)FreeRTOS的列表和列表项

六、FreeRTOS的列表和列表项 文章目录 六、FreeRTOS的列表和列表项列表相关结构体列表项相关结构体迷你列表项列表相关API函数介绍初始化列表vListInitialise()函数vListInitialiseItem()函数vListInsert()函数 vListInsertEnd()函数 uxListRemove() 列表就是一个双向链表&…

数据结构:串(定义,基本操作,存储结构)

目录 1.串的定义2.串的基本操作3.字符集编码4.串的存储结构1.顺序存储2.链式存储 1.串的定义 串&#xff0c;即字符串( String&#xff09;是由零个或多个字符组成的有限序列。 一般记为s ‘a1a2……an’ (n ≥0) 其中&#xff0c;S是串名&#xff0c;单引号括起来的字符序列是…