观察者模式 Observer

观察者模式属于行为型模式。在程序设计中,观察者模式通常由两个对象组成:观察者和被观察者。当被观察者状态发生改变时,它会通知所有的观察者对象,使他们能够及时做出响应。

三要素:观察者(Observer),被观察者,事件。
观察者 将自己注册到被观察对象中,被观察对象将观察者存放在一个容器里。
被观察者 事件发生了变化,被观察者从容器中得到注册的观察者,将变化通知观察者。

/*
教室里老师还没有来,小张正在打游戏,小李正在抄作业。
班长监视老师,当老师来了通知大家。然后打游戏的停止,抄作业的也停止。
班长是通知者(被观察者),小张/小李是观察者。
*/
//Observer.h
#include <list>
using namespace std;class ITeacherObserver
{
public:virtual void onTecherComming(int value) = 0;
};
//MonitorNotifier.h
#include <list>
#include "Observer.h"
using namespace std;class MonitorNotifier //班长,被观察者类
{
public:void AddObserver(ITeacherObserver *observer);void RemoveObserver(ITeacherObserver *observer);void NotifyObserver();void setValue(int value);private:list<ITeacherObserver *> listenners;int mValue;
};//MonitorNotifier.cpp
#include "MonitorNotifier.cpp"class MonitorNotifier //班长,被观察者类
{
public:void AddObserver(ITeacherObserver *observer){listenners.push_back(observer);}void RemoveObserver(ITeacherObserver *observer){ITeacherObserver *it;for (it = listenners.begin(); it != listenners.end(); it++){if (*it == observer){listenners.remove(observer); break;}}}void NotifyObserver(){list<ITeacherObserver *>::iterator it;for (it = listenners.begin(); it != listenners.end(); it++){(*it)->onTecherComming(mValue);}}void setValue(int value){mValue = value;NotifyObserver();}
private:list<ITeacherObserver *> listenners;int mValue;
};
//ZhangSan.h
#include "Observer.h"class ZhangSan : public ITeacherObserver //观察者类ZhangSan
{
public:void onTecherComming(int value);void stopCopyWork(int value);
};//ZhangSan.cpp
#include "ZhangSan.h"class ZhangSan : public ITeacherObserver //观察者类ZhangSan
{
public:void onTecherComming(int value){stopCopyWork(value);}void stopCopyWork(int value){printf("zhangsan stopCopyWork + %d\n" ,value);}
};
//LiSi.h
#include "Observer.h"class LiSi : public ITeacherObserver //观察者类LiSi
{
public:void onTecherComming(int value);void stopPlayGame(int value);
};//LiSi.cpp
#include "LiSi.h"class LiSi : public ITeacherObserver //观察者类LiSi
{
public:void onTecherComming(int value){stopPlayGame(value);}void stopPlayGame(int value){printf("lisi stopPlayGame + %d\n" ,value);}
};
#include <iostream>
#include "ZhangSan.h"
#include "LiSi.h"
#include "Observer.h"int main(int argc, _TCHAR* argv[])
{MonitorNotifier monitor;ZhangSan zs;monitor.AddObserver(&zs);//LiSi ls;//monitor.AddObserver(&ls);monitor.setValue(1);return 0;
}

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

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

相关文章

Docker 学习路线:构建和优化容器镜像

容器镜像和Dockerfile 容器镜像是可执行的软件包&#xff0c;包括运行应用程序所需的所有内容&#xff1a;代码、运行时、系统工具、库和设置。通过构建自定义镜像&#xff0c;您可以在任何支持 Docker 的平台上无缝地部署应用程序及其所有依赖项。 Dockerfile 构建容器镜像…

python如何学习最为高效?

学习Python最有效的方法因人而异&#xff0c;但以下是一些建议&#xff0c;可以帮助你更高效地学习Python&#xff1a; 1.明确学习目标&#xff1a; 在开始学习之前&#xff0c;明确你的学习目标。你想要学习Python的哪些方面&#xff1f;是想要掌握基础语法、编写代码、做项目…

PyTorch加载数据以及Tensorboard的使用

一、PyTorch加载数据初认识 Dataset:提供一种方式去获取数据及其label 如何获取每一个数据及其label 总共有多少的数据 Dataloader:为后面的网络提供不同的数据形式 数据集 在编译器中导入Dataset from torch.utils.data import Dataset 可以在jupyter中查看Dataset官方文档&…

围绕天津这个城市我们可以做哪些课题选题,供大家参考

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

confluence操作手册

文章目录 快捷键插入宏插入代码块 自动为标题编号使用方法&#xff1a; 移动页面到其它目录层级下 快捷键 插入宏 英文输入法下输入{ 插入代码块 输入三个会跳出 点编辑可以调整样式 自动为标题编号 安装插件Numbered Headings 下载链接&#xff1a;https://appfire.…

Hive-分区与分桶详解(超详细)

文章目录 前言一、Hive分区1. 什么是分区2. 分区的优势3. 如何创建分区表4. 如何插入分区数据5. 如何查询分区数据6. 分区因素 二、Hive分桶1. 什么是分桶2. 分桶的优势3. 如何创建分桶表4. 如何插入分桶数据5. 如何查询分桶数据6. 分桶因素7. 分区和分桶的综合应用 总结 前言 …

CCCC第一题

假设你有两只手&#xff08;这个好像不用假设 - -&#xff01;&#xff09;&#xff0c;在你的面前有一堆的糖&#xff0c;左手拿了a颗&#xff0c;右手拿了b颗&#xff0c;请问你一共拿了多少颗糖。 输入格式: 每次输入两个整数a和b&#xff0c;代表你左手和右手拿糖的颗数&…

asp.net core自定义授权过滤器

//只有登录的用户可以访问 1.统一返回格式 namespace webapi;/// <summary> /// 统一数据响应格式 /// </summary> public class Results<T> {/// <summary>/// 自定义的响应码&#xff0c;可以和http响应码一致&#xff0c;也可以不一致/// </sum…

微服务 Spring Cloud 10,如何追踪微服务调用?服务治理的常见手段

目录 一、服务追踪的作用1、优化系统瓶颈2、优化链路调用3、故障排查4、性能优化5、生成网络拓扑图4、透明传输数据 二、节点管理1、服务调用失败一般有两类原因造成&#xff1a;2、服务调用失败的解决方式&#xff1a;3、服务调用失败的具体解决方式&#xff1a; 三、负载均衡…

设计模式中的设计原则

开闭原则&#xff1a;扩展新的功能但不改变原有的程序设计。 public class test {public static void main(String[] args) {Car benz new Car("Benz");benz.driver();//我们需要扩展方法benz.driver180();} } class Car{private String name;public Car(String nam…

vue3 H5项目中实现PDF预览

是需要npm i vue-pdf-embed 安装这个插件的&#xff0c;可兼容ios/Android&#xff0c;下面是本人的使用实例 <template><div class"conten_box"><vue-pdf-embed v-if"pdfSource.url" :source"pdfSource" /></div> <…

ansible的控制语句

本章内容主要介绍 playbook 中的控制语句 使用when判断语句block-rescue判断循环语句 一个play中可以包含多个task&#xff0c;如果不想所有的task全部执行&#xff0c;可以设置只有满足某个条件才执行这个task&#xff0c;不满足条件则不执行此task。本章主要讲解when 和 blo…

typeof 和 instanceofJS数据类型(js的问题)

原始类型&#xff08;基本类型&#xff09;Undefined Null Boolean Number String引用类型&#xff08;复杂类型&#xff09;Object 1、typeof检测返回对应数据类型 console.log(typeof 123); // number console.log(typeof true); // boolean console.log(typeof "hell…

Epson爱普生手臂机器人与PC通讯 C#

一、Epson手臂配置 1.安装Epson手臂控制软件 安装Epson手臂控制软体EPSON RC+ 7.0(根据实际需求下载应用),可以去官网下载安装。 2.硬件配置 准备一台PC,用网线连接PC和EPSON手臂控制器。 3.在PC上修改IP地址 EPSON手臂默认IP(192.168.0.1),PC IP改为手臂同一网段…

XML简介 (EXtensible Markup Language)

XML简介 (EXtensible Markup Language) 可扩展标记语言 特点 XML与操作系统、编程语言的开发平台无关实现不同系统之间的数据交换 作用 数据交互配置应用程序和网站Ajax基石 XML标签 XML文档内容由一系列标签元素组成 <元素名 属性名"属性值">元素内容&l…

【模式识别】探秘判别奥秘:Fisher线性判别算法的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《模式之谜 | 数据奇迹解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f30c;1 初识模式识…

如何通过蓝牙串口启动智能物联网?

1、低功耗蓝牙(BLE)介绍 BLE 技术是一种低成本、短距离、可互操作的鲁棒性无线技术&#xff0c;工作在免许可的 2,4 GHZ 工业、科学、医学(Industrial Scientific Medical&#xff0c;ISM)频段。BLE在设计之初便被定位为一种超低功耗(Ultra Low Power&#xff0c;ULP)无线技术&…

C语言实现UCS2、UTF8与GBK2312编码转换

一、引言 在软件开发中&#xff0c;字符编码是一个非常重要的概念。不同的编码方式用于在不同的系统和应用中表示文本数据。UCS2、UTF8和GBK2312是三种常见的字符编码方式。为了实现不同编码间的转换&#xff0c;我们可以使用C语言进行编程&#xff0c;利用已有的库或者手动实…

浅谈Guava Cache的参数使用

CacheLoader 用于数据加载方式比较固定且统一的场景&#xff0c;在缓存容器创建的时候就需要指定此具体的加载逻辑。通常开发中使用时我们需要继承CacheLoader类或写一个匿名实现类实现其load方法和reload方法 load方法 当执行get操作没有命中缓存或者判断缓存已经超出expir…

【Prometheus|报错】Out of bounds

【背景】进入Prometheus地址的9090端口&#xff0c;pushgateway&#xff08;0/1&#xff09;error : out of bounds 【排查分析】 1、out of bounds报错&#xff0c;是由于Prometheus向tsdb存数据出错&#xff0c;与最新存数据的时间序列有问题&#xff0c;有可能当前时间与最…