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

设计模式 --5观察者模式

观察者模式

在这里插入图片描述

观察者模式的优缺点

优点

  • 当一个对象改变的时候 需要同时改变其他对象的相关动作的时候 ,而且它不知道有多少具体的对象需要改变 应该考虑使用观察者模式 。
  • 观察者模式的工作就是解除耦合 让耦合双方都依赖与抽象 而不是具体 是的各自改变都不会影响另一边工作

缺点

  • 具体的观察类里面的update方法太单调了 现实是每个观察者的动作都可能都所不同

可以使用两种方式去解决此类问题
1:具体的观察者实现具体的 自己需要完成的任务 在继承抽象Observer后 在update内部直接调用具体的方式
2:具体的观察者将自己具体的动作也同时注册到 通知类里面 改变通知类里面的容器为map容器类 key为具体的观察者 value为具体的处理函数

代码

只实现基础部分
在这里插入图片描述

#include <iostream>  
#include <set>  
using namespace std;// 抽象观察者  
class Observer {
public:virtual void update(const string& subjectState) = 0;
};// 抽象主题  
class Subject {
public:virtual void Attach(Observer* observer) = 0;virtual void Detach(Observer* observer) = 0;virtual void Notify(const string& state) = 0;virtual string GetSubjectState() const = 0;virtual void SetSubjectState(const string& state) = 0;
};// 具体主题  
class ConcreteSubject : public Subject {
public:void Attach(Observer* observer) override {observers.insert(observer);}void Detach(Observer* observer) override {observers.erase(observer);}void Notify(const string& state) override {for (auto observer : observers) {observer->update(state);}}string GetSubjectState() const override {return subjectState;}void SetSubjectState(const string& state) override {subjectState = state;Notify(subjectState); // 当状态改变时,通知所有观察者  }private:set<Observer*> observers;string subjectState;
};// 具体观察者  
class ConcreteObserver : public Observer {
public:ConcreteObserver(const string& name, const string& initialState): name(name), observerState(initialState) {}void update(const string& subjectState) override {observerState = subjectState;cout << "观察者: " << name << " 的新状态是 " << observerState << endl;}private:string name;string observerState;
};int main() {ConcreteSubject* s = new ConcreteSubject();s->Attach(new ConcreteObserver("小明", "松懈"));s->Attach(new ConcreteObserver("蔡徐坤", "松懈"));// 改变主题状态,这将触发通知  s->SetSubjectState("警惕");return 0;
}

相关文章:

设计模式 --5观察者模式

观察者模式 观察者模式的优缺点 优点 当一个对象改变的时候 需要同时改变其他对象的相关动作的时候 &#xff0c;而且它不知道有多少具体的对象需要改变 应该考虑使用观察者模式 。观察者模式的工作就是解除耦合 让耦合双方都依赖与抽象 而不是具体 是的各自改变都不会影响另…...

跨平台的组播测试工具mping、udp_sender及udp_reciver的源码及使用教程

文章目录 1.前言2.mping工具编译3.mping工具使用3.1 参数说明3.1 组播播发&#xff08;-s&#xff09;3.1 组播播发&#xff08;-r&#xff09;3.3 Linux下mping测试 4.Linux组播udp_sender及udp_reciver使用4.1 udp_sender源码4.1 udp_reciver源码4.3 编译方法4.4 测试使用4.4…...

Linux基础篇:文件系统介绍——根目录下文件夹含义与作用介绍

Linux文件系统介绍——文件夹含义与作用 Linux文件系统是一个组织和管理文件的层次结构。它包括了目录、子目录和文件&#xff0c;这些都是按照一定的规则和标准进行组织的。以下是Linux文件系统的一些关键组成部分&#xff1a; 1./bin&#xff1a; 该目录包含了系统启动和运…...

vulhub中Apache Solr RemoteStreaming 文件读取与SSRF漏洞复现

Apache Solr 是一个开源的搜索服务器。在Apache Solr未开启认证的情况下&#xff0c;攻击者可直接构造特定请求开启特定配置&#xff0c;并最终造成SSRF或任意文件读取。 访问http://your-ip:8983即可查看Apache Solr后台 1.访问http://your-ip:8983/solr/admin/cores?indexI…...

PHP在线加密系统网站源码

源码介绍 PHP在线加密系统网站源码&#xff0c;这个是sg的加密,免费可用(目前)并不会收费 源码说明&#xff1a;下载直接上传即可 下载地址 蓝奏云下载&#xff1a;https://wfr.lanzout.com/i6c331togiji...

【C++】哈希思想的应用(位图、布隆过滤器)及海量数据处理方法

文章目录 前言位图什么是位图简单实现一个自己的位图位图的应用场景 布隆过滤器位图的缺陷及布隆过滤器的提出布隆过滤器的概念简单实现一个自己的布隆过滤器布隆过滤器的优缺点布隆过滤器的应用场景 海量数据处理 前言 哈希思想的在实际中的应用除了哈希表这个数据结构之外还…...

蓝桥杯(5):python动态规划DF[2:背包问题]

1 0-1背包介绍【每件物品只能拿1件或者不拿】 1.1 简介 贪心是不可以的&#xff01;&#xff01;&#xff01; 1.2 状态 及状态转移 转移解释&#xff1a;要么不选 则上一个直接转移过来【dp[i-1][j]】&#xff0c;要么是选这个之后体积为j 则上一个对应的就是【dp[i-1][j-wi]…...

臻奶惠无人售货机:新零售时代的便捷消费革命

臻奶惠无人售货机&#xff1a;新零售时代的便捷消费革命 在新零售的浪潮中&#xff0c;智能无人售货机作为一个创新的消费模式&#xff0c;已经成为距离消费者最近的便捷购物点之一。这种模式不仅能够满足居民对消费升级的需求&#xff0c;还能通过建立多样化和多层次的消费体…...

4月04日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 地震预警App被曝收10元年费&#xff0c;回应称仅限苹果系统 &#x1f30d; 2024清明档首日票房破2亿 &#x1f30b; 浙江省杭州市余杭区设立2亿元网络微短剧发展基金 &#x1f381; 抖音拟以超 7.5 亿元收购海联金汇旗下…...

C++数据结构——顺序表——数值统计

C数据结构——顺序表——数值统计 接着上一篇的顺序表模板。 输入数组&#xff0c;统计数组中的负数、零、正数的个数。第一个数字,表示数组有几个数,当n为0时&#xff0c;输入结束&#xff0c;不做处理。 例如&#xff1a; 输入6 0 1 2 3 -1 0 输出1 2 3 int main() {int n;…...

Linux+HA高可用24X7的安全保证

一&#xff0e; 介绍作为服务器&#xff0c;需要提供一定的24X7的安全保证&#xff0c;这样可以防止关键节点的宕机引起系统的全面崩溃。利用OpenSource开源软件&#xff0c;完成系统的高可靠双机热备方案。基于linux的 HA软件可靠稳定&#xff0c;比使用商业版本的HA软件降低成…...

【Tomcat】Apache官方结束Tomcat 8.5分支版本技术支持

根据 Apache 官方发布的声明&#xff0c;Apache官方将于2024年3月31日后正式结束对于Tomcat 8.5这个分支版本的技术支持&#xff0c;包括以下几点&#xff1a; 1&#xff09;不太可能继续为 8.5 分支发布新的版本&#xff1b; 2&#xff09;仅影响 8.5 分支的漏洞将不会被解决&…...

Go 源码之读写锁 sync.RWMutex

Go 源码之读写锁 sync.RWMutex 文章目录 Go 源码之读写锁 sync.RWMutex一、简介二、源码(一)RWMutex数据结构(二)Lock(三)Unlock(四)TryRLock(五)Rlock(六)RUnlock三、常见问题1. 什么是CAS,什么是原子操作2. 写操作是如何阻止写操作的3. 写操作是如何阻止读操作的…...

大数据实验统计-1、Hadoop安装及使用;2、HDFS编程实践;3、HBase编程实践;4、MapReduce编程实践

大数据实验统计 1、Hadoop安装及使用&#xff1b; 一&#xff0e;实验内容 Hadoop安装使用&#xff1a; 1&#xff09;在PC机上以伪分布式模式安装Hadoop&#xff1b; 2&#xff09;访问Web界面查看Hadoop信息。 二&#xff0e;实验目的 1、熟悉Hadoop的安装流程。 2、…...

PyTorch搭建Informer实现长序列时间序列预测

目录 I. 前言II. InformerIII. 代码3.1 输入编码3.1.1 Token Embedding3.1.2 Positional Embedding3.1.3 Temporal Embedding 3.2 Encoder与Decoder IV. 实验 I. 前言 前面已经写了很多关于时间序列预测的文章&#xff1a; 深入理解PyTorch中LSTM的输入和输出&#xff08;从i…...

firefox切换本地服务和全球服务的方法

方法1&#xff1a;“设置”>“同步">“切换全球/本地服务器” https://jingyan.baidu.com/article/1974b2898523bbb5b1f774e2.html 方法2&#xff1a;地址栏输入about:config&#xff0c;搜索首选项名称里输入identity.fxaccounts.autoconfig.uri&#xff0c;填入…...

Windows下用CMake编译PugiXML及配置测试

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 PugiXML是什么&#xff1f; PugiXML 是一个用于解析和操作 XML 文档的 C 库。它提供了简单易用的接口&#xff0c;能够高效地加载…...

python-基础篇-字符串、列表、元祖、字典-列表

文章目录 2.3.2列表2.3.2.1列表介绍2.3.2.1.1列表的格式2.3.2.1.2打印列表 2.3.2.2列表的增删改查2.3.2.2.1列表的遍历2.3.2.2.1.1使用for循环2.3.2.2.1.2使用while循环 2.3.2.2.2添加元素("增"append, extend, insert)2.3.2.2.2.1append 2.3.2.2.2.2extend2.3.2.2.2…...

Qt控件样式设置其一(常见方法及优缺点)

如果你对Qt有基本的了解&#xff0c;应该知道它的一大优点是跨平台&#xff0c;可以在不同的系统中编译运行。但在我看来&#xff0c;Qt还有另外一个优点&#xff0c;就是制作界面比较方便和灵活&#xff0c;能够实现主流静态效果的桌面应用。&#xff08;如果需要实现比较灵动…...

软件测试(测试用例详解)(三)

1. 测试用例的概念 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合。 测试环境操作步骤测试数据预取结果 测试用例的评价标准&#xff1a; 用例表达清楚&#xff0c;无二义性。。用例可操作性强。用例的输入与输出明确。一条用例只有…...

跨界阅读如何提升工程师思维:从历史轶事看芯片验证与项目管理

1. 从拿破仑的“私藏”到芯片设计的奇闻&#xff1a;一本跨界奇书的阅读体验作为一名在电子设计自动化&#xff08;EDA&#xff09;和可编程逻辑领域摸爬滚打了十多年的工程师&#xff0c;我的日常被Verilog代码、时序约束、PCB走线和散热仿真填满。书架上也堆满了《CMOS VLSI设…...

LED显示的“芯片革命”:行列合一,正在改写画质的底层逻辑

如果你一直在跟踪LED显示屏的技术演进&#xff0c;可能会发现一个趋势&#xff1a;近两年行业对“画质”的讨论&#xff0c;焦点正从控制系统、封装工艺&#xff0c;逐步下沉到更底层的驱动芯片架构上。过去行业普遍关注扫数、刷新率和低灰表现对画质的影响&#xff0c;但有一个…...

AI圈内两大热词 Agent 和 Skill,一文彻底搞懂它们之间的区别与联系!

本文以餐厅经理和厨师的类比&#xff0c;解释了 Agent 和 Skill 的核心区别&#xff1a;Agent 拥有决策权&#xff0c;决定下一步做什么&#xff1b;Skill 则负责执行具体任务。文章指出&#xff0c;尽管在实际应用中两者界限逐渐模糊&#xff0c;但在构建 AI 系统时&#xff0…...

智能算法车队换道决策与轨迹规划【附仿真】

✨ 长期致力于车队换道、支持向量机、决策树、换道决策、多目标优化研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;NGSIM数据清洗与特征重构&#xf…...

C# —— 结构体、类型转换与运算符

一、结构体&#xff08;struct&#xff09;与常量&#xff08;const&#xff09;结构体用于打包多个相关变量&#xff0c;常量用于定义不可修改的值&#xff0c;是规范数据的常用方式。1. 结构体&#xff08;struct&#xff09;作用&#xff1a;把多个变量打包成一个整体&#…...

MySQL性能优化:慢查询分析与索引设计艺术

MySQL性能优化&#xff1a;慢查询分析与索引设计艺术 引言 MySQL是世界上最流行的开源关系型数据库之一&#xff0c;但再强大的数据库在不当使用下也会出现性能问题。慢查询是数据库性能的头号杀手&#xff0c;而正确的索引设计则是解决慢查询的关键。本文将深入探讨MySQL慢查询…...

Zynq平台实战:为Linux内核打上Preempt-RT实时补丁

1. 为什么Zynq需要实时Linux内核&#xff1f; 在工业控制、机器人、医疗设备等对时序要求严格的领域&#xff0c;毫秒级的延迟都可能导致灾难性后果。Xilinx Zynq-7000这类异构SoC虽然集成了ARM处理器和FPGA&#xff0c;但标准Linux内核的完全公平调度器&#xff08;CFS&#x…...

如何利用The Incredible PyTorch离线文档:深度学习者的终极学习宝典

如何利用The Incredible PyTorch离线文档&#xff1a;深度学习者的终极学习宝典 【免费下载链接】the-incredible-pytorch The Incredible PyTorch: a curated list of tutorials, papers, projects, communities and more relating to PyTorch. 项目地址: https://gitcode.…...

云代理商:Hermes Agent如何通过技能沉淀降低长期算力消耗

在 AI 智能体规模化落地的今天&#xff0c;算力成本高、重复推理多、长期运行效率衰减&#xff0c;已成为企业和开发者的核心痛点。传统 AI 智能体每处理一次相似任务&#xff0c;都要从零开始推理、反复调用工具&#xff0c;大量算力浪费在重复劳动中&#xff0c;长期使用成本…...

5分钟快速掌握:Sonar CNES Report代码质量报告生成终极指南

5分钟快速掌握&#xff1a;Sonar CNES Report代码质量报告生成终极指南 【免费下载链接】sonar-cnes-report Generates analysis reports from SonarQube web API. 项目地址: https://gitcode.com/gh_mirrors/so/sonar-cnes-report 你是否曾为向团队展示代码质量数据而烦…...