设计模式--观察者模式

观察者模式是一种行为设计模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,它的所有依赖者都会自动收到通知并更新。这种模式在许多应用场景中非常有用,例如在实现事件驱动编程、消息队列、发布-订阅模型以及依赖注入时。

应用场景

  1. 事件驱动编程:当需要实现事件驱动编程时,可以使用观察者模式来定义事件和事件监听器。
  2. 消息队列:当需要实现一个消息队列,其中生产者发布消息,消费者订阅消息时,可以使用观察者模式来管理消息的发布和订阅。
  3. 发布-订阅模型:当需要实现一个发布-订阅模型,其中发布者发布消息,订阅者订阅消息时,可以使用观察者模式来管理消息的发布和订阅。
  4. 依赖注入:当需要实现依赖注入时,可以使用观察者模式来管理依赖关系的注入。

使用技巧与注意事项

  1. 定义观察者接口:为了使用观察者模式,需要定义一个观察者接口,该接口包含处理事件的方法。
  2. 避免滥用:如果对象间的依赖关系很简单,可能不需要使用观察者模式,直接使用对象的方法即可。

C++代码示例

下面是一个使用C++编写的观察者模式示例代码:

#include <iostream>
#include <list>
// 观察者接口
class Observer {
public:virtual void update(int data) = 0;
};
// 具体观察者类
class ConcreteObserver : public Observer {
private:int data;
public:void update(int data) override {this->data = data;std::cout << "ConcreteObserver's data: " << data << std::endl;}
};
// 主题接口
class Subject {
public:virtual void registerObserver(Observer* observer) = 0;virtual void removeObserver(Observer* observer) = 0;virtual void notifyObservers(int data) = 0;
};
// 具体主题类
class ConcreteSubject : public Subject {
private:std::list<Observer*> observers;
public:void registerObserver(Observer* observer) override {observers.push_back(observer);}void removeObserver(Observer* observer) override {observers.remove(observer);}void notifyObservers(int data) override {for (auto observer : observers) {observer->update(data);}}
};
int main() {ConcreteObserver* observer1 = new ConcreteObserver();ConcreteObserver* observer2 = new ConcreteObserver();ConcreteSubject* subject = new ConcreteSubject();subject->registerObserver(observer1);subject->registerObserver(observer2);subject->notifyObservers(10);subject->removeObserver(observer1);subject->notifyObservers(20);delete observer1;delete observer2;delete subject;return 0;
}

在这个示例中,我们定义了一个观察者接口 Observer,它声明了处理事件的方法。具体观察者类 ConcreteObserver 实现了这些方法,并持有数据。主题接口 Subject 定义了注册、移除和通知观察者的方法。具体主题类 ConcreteSubject 实现了这些方法,并持有观察者列表。客户端代码首先创建观察者对象,然后创建主题对象,并注册观察者。通过这个示例,我们可以看到观察者模式在C++中的实现。
总之,观察者模式是一种非常有用的设计模式,它可以帮助我们管理对象间的依赖关系,实现事件驱动编程,以及实现发布-订阅模型。在实际开发中,我们需要根据具体的应用场景来选择是否使用观察者模式,并注意相关的使用技巧和注意事项。

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

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

相关文章

vue 引入 emoji 表情包

vue 引入 emoji 表情包 一、安装二、组件内使用 一、安装 npm install --save emoji-mart-vue二、组件内使用 import { Picker } from "emoji-mart-vue"; //引入组件<picker :include"[people,Smileys]" :showSearch"false" :showPreview&q…

秒杀系统如何设计?【面试准备】

秒杀系统如何设计&#xff1f;【面试准备】 前言版权推荐秒杀系统如何设计&#xff1f;库存如何扣减的设计支付-延时队列最后 前言 2023-9-1 16:23:31 公开发布于 2024-5-22 00:09:02 以下内容源自《【面试准备】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话…

找钢集团亮相沙特利雅得建筑行业供应链展会

5月20日-21日&#xff0c;找钢产业互联集团&#xff08;以下简称&#xff1a;找钢集团&#xff09;亮相沙特利雅得建筑行业供应链展会。本次展会由沙特阿拉伯国家住房公司&#xff08;NHC&#xff09;主办&#xff0c;中信建设协办&#xff0c;涵盖住房新科技、绿色环保等多个主…

六零导航页 file.php 任意文件上传漏洞复现(CVE-2024-34982)

0x01 产品简介 LyLme Spage(六零导航页)是中国六零(LyLme)开源的一个导航页面。致力于简洁高效无广告的上网导航和搜索入口,支持后台添加链接、自定义搜索引擎,沉淀最具价值链接,全站无商业推广,简约而不简单。 0x02 漏洞概述 六零导航页 file.php接口处任意文件上传…

使用API有效率地管理Dynadot域名,进行域名邮箱的默认邮件转发设置

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

头歌OpenGauss数据库-I.复杂查询第5关:至少学了某位学生(Oliver)所学的全部课程的学生

本关任务&#xff1a;根据提供的表和数据&#xff0c;查询至少学了Oliver同学所学的全部课程的其他同学的信息&#xff08;学号s_id&#xff0c;姓名s_name&#xff09;。 student表数据&#xff1a; s_ids_names_sex01Mia女02Riley男03Aria女04Lucas女05Oliver男06Caden男07Li…

DFS:解决二叉树问题

文章目录 了解DFS1.计算布尔二叉树的值思路代码展示 2.求根节点到叶节点数字之和思路代码展示 3.二叉树剪枝思路代码展示 4.验证二叉搜索树思路分析代码展示 5.二叉搜索树中第k小元素思路&#xff1a;代码展示 6.二叉树的所有路径思路分析代码展示 总结 了解DFS 所谓DFS就是就…

OceanBase V4.2 特性解析:MySQL兼容之rename column 语法支持

1. 背景描述 MySQL 自8.0版本起&#xff0c;已支持rename column语法&#xff0c;这一语法允许用户在不更改列定义的情况下&#xff0c;为列重新命名。下面为使用rename column语法的一个具体示例&#xff1a; alter table t1 rename column col_a to col_b; 在OceanBase过去…

如何秒杀Promise面试题

如何秒杀Promise面试题 如果你在面试的时候技术面给你出了点关于Promise的面试题首先不要慌&#xff0c;先问候他爹妈一套问候语&#xff01; 然后切记不要(ps:这是病句别在意!&#x1f923;) 自己想 找他要纸和笔 首先关于promise的面试题无非就是 promise 的状态和宏队列、…

git pull 出错 fatal: bad object refs/remotes/origin/xxxxx

使用git pull时出现以下问题 fatal: bad object refs/remotes/origin/xxxxx error: https://github.com/xxxxxx.git did not send all necessary objects解决办法 删除项目目录 .git\refs\remotes\origin 下面的所有文件 在 git pull 参考链接 How to handle git gc fatal: b…

5.23.9 TransUNet:Transformers 为医学图像分割提供强大的编码器

TransUNet&#xff0c;它兼具 Transformers 和 U-Net 的优点&#xff0c;作为医学图像分割的强大替代方案。一方面&#xff0c;Transformer 对来自卷积神经网络 (CNN) 特征图的标记化图像块进行编码&#xff0c;作为用于提取全局上下文的输入序列。另一方面&#xff0c;解码器对…

css去除复选框默认样式

HTML: <input type"checkbox" id"myCheckbox" class"custom-checkbox" /> <label for"myCheckbox" class"checkbox-label">自定义复选框</label> CSS: /* 隐藏默认复选框 */.custom-checkbox { -webk…

Go知识点复习

Go知识点复习 1.关于包的使用和GOPATH的配置 src:用于以代码包的形式组织并保存Go源码文件, 需要手动创建pkg目录&#xff1a;用于存放经由go install命令构建安装后的代码包&#xff08;包含Go库源码文件&#xff09;的“.a”归档文件bin目录&#xff1a;与pkg目录类似&…

C++学习-hello word

#include "iostream" #预处理指令 using namespace std; #预处理指令 int main() #程序执行从这里开始 {cout << "Hello, World!" << endl; #逻辑代码&#xff08;具体的功能代码&#xff09;return 0; …

国家开放大学,javaScript程序设计-形考任务-实训五:设计登录和注册页|实训六:设计简单的购物车

实训五&#xff1a;设计登录和注册页 1. 题目 设计登录和注册页。 2. 目的 &#xff08;1&#xff09;掌握表单域的引用方法。 &#xff08;2&#xff09;掌握常用控件的基本方法。 &#xff08;3&#xff09;掌握事件的处理方法。 &#xff08;4&#xff09;理解Cookie…

tomcat三级指导

版本 ./catalina.sh linux version.bat win 1.确认是否使用了tomcat管理后台 我们先找到配置文件&#xff1a;tomcat主目录下/conf/server.xml 可以查看到连接端口&#xff0c;默认为8080 然后查看manager-gui管理页面配置文件&#xff0c;是否设置了用户登录 配置文件…

如何创建 Gala Games 账户:解决 Cloudflare 验证指南 2024

Gala Games 站在数字娱乐新时代的前沿&#xff0c;将区块链技术与游戏相结合&#xff0c;重新定义了所有权和奖励。本文将引导您创建 Gala Games 账户并使用 CapSolver 解决 Cloudflare 验证难题&#xff0c;确保您顺利进入这一创新的生态系统。 什么是 Gala Games&#xff1f…

CRMEB开源商城标准版系统前端技术架构与实践探索

摘要&#xff1a; 随着电子商务的蓬勃发展&#xff0c;开源商城系统因其灵活性、可扩展性和成本效益受到了广泛关注。本文以CRMEB开源商城系统为例&#xff0c;探讨了其前端技术架构、开发实践及未来展望。通过对CRMEB系统前端技术的深入分析&#xff0c;旨在为开发者提供有价值…

JS的for循环中的var 和 let

在js的嵌套for循环异步执行&#xff0c;声明 i 和 使用 i 获取到的变量 都要用 let 声明&#xff0c;不要用var。 除非封装一个函数&#xff0c;把参数传进去调用&#xff0c;才能避免var使用最后一个变量&#xff0c;没必要。 同步 vs 异步: Java.perform 本身是同步执行的。…

筛斗数据:文档识别技术在教育行业的影响

随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经在各个领域产生了深远的影响。其中&#xff0c;文档识别技术作为人工智能的一个重要分支&#xff0c;在教育行业中也发挥着越来越重要的作用。本文将探讨文档识别技术在教育行业中的应用及其带来的影…