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

C# 构建观测者模式(或者为订阅者模型)

前言:

观测者模型的基本理念,就是,我有一个公共的事件,定义好他的事件的触发、数据接口。然后,通过增加订阅者(实例)来订阅这个事件的,或者说观察这个事件。如果事件发生,订阅了事件或订阅了观察的类就执行这个时间的方法(触发的执行)。

这种方式的好处,就是解耦了生产者(事件发生)和消费者(事件处理)的绑定关系,注册观察了再执行,否则不执行。


1 观察者(发布-订阅)模式的构建:

1.1 EventHandler(系统定义的事件委托Handler,也就是处理事件的方法)

 C# Formworks 定义的事件定义在 System.EventHandler 中的委托,包括事件发送者,和发送的事件数据对象两个参数。


 2 定义数据事件提供者类

定义了一个名为 DataEventProvider 的公共静态类

2.1.1 定义事件 DataChanged和事件的句柄(接口): 

数据事件提供者,首先要有一个事件,这里就是DataChanged。

    public static class DataEventProvider{public static event EventHandler<DataChangedEventArgs> DataChanged;public static void OnDataChanged(IFrameOut newFrame){DataChanged?.Invoke(null, new DataChangedEventArgs(newFrame));}}

 有了事件DataChanged,同时还提供一个,事件的接口,也就是你要通知订阅的人发生了声明,然后,给粗发生的事情的证据(数据)

也就是,出事了,然后,有这么一堆数据(来说明,和准备处理)、

EventArgs 就是来说明什么事件的,但,他默认的定义是空的,就等着你构建事件的时候,自己去定义需要哪些证据。

在,我们的案例里面,我们就把EventArgs,给泛型(也就是说明白了),那么通过EventHandler<DataChangedEventArgs>,把接口泛型到DataChangedEventArgs的定义里面,如下:

    public class DataChangedEventArgs : EventArgs{public IFrameOut NewFrame { get; } //拿到数据public DataChangedEventArgs(IFrameOut newFrame){NewFrame = newFrame; // 给到事件订阅者}}

 在DataChangedEventArgs里面,我们清楚的定义了一个IFrame的图像的处理数据,拿到数据,同时把数据传递给事件订阅者,作为事件要处理的接口。

 【案】,        public static event EventHandler<DataChangedEventArgs> DataChanged;

DataChanged 是一个公共的静态事件。
他的定义详细如下:
1 public static:类级别的公共静态变量

2 event类型:是一种特殊的成员,允许对象订阅和响应由其他对象发出的信号或消息。

3 为 EventHandler<DataChangedEventArgs>

EventHandler 第一节已经说了,<DataChangedEventArgs>是EventHandler的泛型版本,表示事件处理方法EventHandler将接受<DataChangedEventArgs>泛型定义的参数,这里我们的<DataChangedEventArgs>是我们自己定义的一个类。派生于EventArgs,因此他也依旧包括EventHandler已经有的相关的数据。

总之,我们的定义了一个 公共的静态事件,类型为 EventHandler<DataChangedEventArgs>。这意味着它可以与任何符合 EventHandler 委托定义的方法关联,并且这些方法将接收一个 DataChangedEventArgs 类型的参数。

 2.1.2  定义事件的方法 OnDataChanged: 

 【案】,        public static void OnDataChanged(IFrameOut newFrame)

OnDataChanged 是一个静态方法, ,这里接受了一个IFrameOut的参数。

            DataChanged?.Invoke(null, new DataChangedEventArgs(newFrame));

这里,DataChanged为之前定义的事件名,


1 条件运算符?

C# 6引入的null条件运算符。它允许你在尝试调用对象的成员之前检查对象(这里为事件源对象,或者观察者)是否为null。如果对象不是null,就执行成员访问;如果是null,则不执行任何操作,并且表达式的结果为null。

这样做的另外一个好处是,线程安全。

Invoke 方法

  • Invoke 是 EventHandler 委托的实例方法,用于触发事件。它接受两个参数:第一个是事件源(通常是一个对象实例),第二个是包含事件数据的 EventArgs 类型的实例。我们之前定义的时候,知道DataChangedEventArgs泛型,继承了之前EventHandler 有的两个基本数据。
  • 在这个例子中,Invoke 被用来触发 DataChanged 事件,通知所有订阅者发生了数据变化。

3 观察者(发布-订阅)模式的使用: 

3.1定义一个观测者事件:

例如,我们在Form1,订阅了这个事件

        private void OnDataChanged(object sender, DataChangedEventArgs e)
{//    拿到事件的参数数据IFrameOut frameOut = e.NewFrame;//     后续进行处理}

3.2 注册一个观测者事件

事件的注册,或者观测者,通过将一个事件处理方法,加到事件定义里面来注册

            DataEventProvider.DataChanged += OnDataChanged;

3.3 触发一个事件发生:

                        DataEventProvider.OnDataChanged(frameOut);

3.4 取消观察:

            DataEventProvider.DataChanged -= OnDataChanged;

 

相关文章:

C# 构建观测者模式(或者为订阅者模型)

前言&#xff1a; 观测者模型的基本理念&#xff0c;就是&#xff0c;我有一个公共的事件&#xff0c;定义好他的事件的触发、数据接口。然后&#xff0c;通过增加订阅者&#xff08;实例&#xff09;来订阅这个事件的&#xff0c;或者说观察这个事件。如果事件发生&#xff0…...

MyBatis入门如何使用操作数据库及常见错误(yml配置)

一&#xff0c;什么是MyBatis 是一款优秀的持久层框架&#xff0c;用于简化jdbc的开发 持久层&#xff1a;指的就是持久化操作的层&#xff0c;通常也就是数据访问层&#xff08;dao&#xff09;&#xff0c;也就是用来操作数据库。 也就是MyBatis是让你更加简单完成程序与数…...

大数据信用查询什么样的平台比较靠谱?

随着互联网的发展和普及&#xff0c;大数据技术逐渐应用到各行各业中&#xff0c;其中之一就是信用查询领域&#xff0c;大数据信用查询平台能够为用户提供全面、准确的大数据信用评估&#xff0c;然而&#xff0c;由于市场上出现了许多不同的大数据信用查询平台&#xff0c;我…...

后端程序员常犯的错误-本地缓存相关bug和技术思考

1 springboot集成本地缓存基本常识&#xff1a; SpringBoot集成本地缓存性能之王Caffeine示例详解 SpringBoot 缓存之 Cacheable介绍 2 线上问题 2.1 发现过程 接口内的rpc调用报错&#xff0c;error级别的日志被监控平台报警。 2.2 故障排查 2.2.1 代码 Cacheable(cach…...

【收集表单数据】

07 【收集表单数据】 在 React 里&#xff0c;HTML 表单元素的工作方式和其他的 DOM 元素有些不同&#xff0c;这是因为表单元素通常会保持一些内部的 state。例如这个纯 HTML 表单只接受一个名称&#xff1a; <form><label>名字:<input type"text"…...

【前端面试】九、框架

目录 1 Vue2 实现方式 2 Vue3 实现方式 3 React 实现方式 4 Angular 实现方式 1 Vue2 实现方式 Vue2 是目前仍被广泛使用的前端框架之一&#xff0c;其特点包括响应式数据绑定、组件化开发等。 响应式系统&#xff1a;Vue2 使用 Object.defineProperty 来实现数据的响应式。…...

水泥电阻在电源电路中的作用

水泥电阻是将电阻线绕在无碱性耐热瓷件上&#xff0c;外面加上耐热、耐湿及耐腐蚀之材料保护固定并把绕线电阻体放入方形瓷器框内&#xff0c;用特殊不燃性耐热水泥充填密封而成。水泥电阻的外侧主要是陶瓷材质&#xff08;一般可分为高铝瓷和长石瓷&#xff09;。 水泥电阻器…...

报销管理软件怎么选?主流的10款对比

国内外排名前十的报销软件大对比&#xff1a;合思、Zoho Expense、金蝶财务报销系统、每刻报销、慧算账、Expensify、齐业成、汇联易、分贝通、QuickBooks Online。 在小型企业中&#xff0c;报销管理可能还可以由财务人员手工完成。然而&#xff0c;对于中到大型企业和快速发展…...

人工智能对就业产生怎样的影响?

在这个飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;如同一股不可阻挡的潮流&#xff0c;深刻地影响着我们的工作方式和生活模式。它既是技术革命的产物&#xff0c;也是推动社会进步的重要力量。然而&#xff0c;随着AI技术的普及和应用&#xff0c;关于其对…...

Vue Router 路由守卫详解

Vue Router 的路由守卫功能使我们能够在路由导航的不同阶段执行代码,提供了极大的灵活性和控制力。路由守卫可以帮助我们在用户导航到特定路由之前、之后或取消导航时执行逻辑,例如权限验证、数据获取或取消操作等。 路由守卫类型 Vue Router 提供了以下几种类型的路由守卫…...

Android 10.0 Launcher 启动流程

在前面SystemUI启动流程中说到&#xff0c;在SystemServer中会去启动各种系统服务&#xff0c;这里的launcher也是启动的其中一个服务ActivityManagerService去启动的。在android10之前&#xff0c;系统四大组件的启动都是在ActivityManagerService中&#xff0c;在android10中…...

OPenCV高级编程——OpenCV视频读写及录制技术详解

目录 引言 一、视频读取技术 VideoCapture 类 构造函数 常用方法 二、视频写入技术 VideoWriter 类 构造函数 常用方法 三、视频录制技术 1. 包含OpenCV头文件 2. 初始化VideoCapture对象 3. 设置视频编码器 4. 读取和写入视频帧 5. 释放资源 6. 编码格式选择 …...

jenkins获取sonarqube质量门禁结果

前景 在使用 Jenkins 集成 SonarQube 时&#xff0c;获取质量门禁&#xff08;Quality Gate&#xff09;结果非常重要。SonarQube 的质量门禁是一种质量控制机制&#xff0c;用于评估代码质量是否符合预设的标准。以下是获取质量门禁结果的意义和作用&#xff1a; 评估代码质量…...

【AI-12】浅显易懂地说一下损失函数

什么是损失函数&#xff1f; 咱们可以把损失函数想象成一个衡量你做的事情“好不好”的尺子。 比如说你在预测明天的天气&#xff0c;你给出的预测结果和实际的天气情况之间会有差别。损失函数就是用来计算这个差别有多大的。 如果你的预测结果和实际情况非常接近&#xff0c;…...

Python和java中super的使用用法(有点小语法上的差距,老忘就在这里置顶了)

文章目录 1 在 Java 中&#xff1a;2 在 Python 中&#xff1a; 在 Java 和 Python 中&#xff0c;子类调用父类方法的语法略有不同&#xff1a; 1 在 Java 中&#xff1a; 使用 super 关键字&#xff1a;在子类中&#xff0c;可以使用 super 关键字来调用父类的方法。super …...

在 QML 中使用 C++ 类和对象

1.实现 C 类&#xff0c;从 QObject 或 QObject 的派生类继承 类中第一行添加 Q_OBJECT 宏 2.修饰成员函数或属性 Q_INVOKABLE 宏用来定义可通过元对象系统访问的方法 Q_PROPERTY 宏用来定义可通过元对象系统访问的属性 信号或者槽&#xff0c;都可以直接在 QML 中访问 3. 在…...

什么是接口?

在前后端开发的语境中&#xff0c;接口&#xff08;Interface&#xff09;是一个非常重要的概念&#xff0c;它充当了前端&#xff08;通常是浏览器端或移动端应用&#xff09;与后端&#xff08;通常是服务器端的应用程序&#xff09;之间进行数据交换的桥梁。接口定义了双方交…...

传统自然语言处理(NLP)与大规模语言模型(LLM)详解

自然语言处理&#xff08;NLP&#xff09;和大规模语言模型&#xff08;LLM&#xff09;是理解和生成人类语言的两种主要方法。本文将介绍传统NLP和LLM的介绍、运行步骤以及它们之间的比较&#xff0c;帮助新手了解这两个领域的基础知识。 传统自然语言处理&#xff08;NLP&…...

实现Obsidian PC端和手机端(安卓)同步

步骤 1&#xff1a;在PC端设置Obsidian 安装Obsidian和Git&#xff1a;确保你的PC上已经安装了Obsidian和Git。你可以从Obsidian官网和Git官网下载并安装。 克隆GitHub代码库&#xff1a;在PC上打开命令行&#xff08;例如Windows的命令提示符或Mac/Linux的终端&#xff09;&a…...

基于大模型的 Agent 进行任务规划的10种方式

基于大模型的 Agent 基本组成应该包含规划&#xff08;planning)&#xff0c;工具&#xff08;Tools)&#xff0c;执行(Action)&#xff0c;和记忆(Memory)四个方面&#xff0c;本节将从 Agent 的概念、ReAct 框架、示例、以及一些论文思路来具体聊下任务规划的话题&#xff0c…...

计算机网络01

文章目录 浏览器输入URL后发生了什么&#xff1f;Linux 系统是如何收发网络包的&#xff1f;Linux 网络协议栈Linux 接收网络包的流程Linux 发送网络包的流程 浏览器输入URL后发生了什么&#xff1f; URL解析 当在浏览器中输入URL后&#xff0c;浏览器首先对拿到的URL进行识别…...

基于SpringBoot微服务架构下前后端分离的MVVM模型浅析

基于SpringBoot微服务架构下前后端分离的MVVM模型浅析 “A Brief Analysis of MVVM Model in Front-end and Back-end Separation based on Spring Boot Microservices Architecture” 完整下载链接:基于SpringBoot微服务架构下前后端分离的MVVM模型浅析 文章目录 基于Spring…...

44444444444

4444444444444444...

数据结构与算法-二分搜索树节点的查找

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、二分搜…...

C++|设计模式(七)|⭐️观察者模式与发布/订阅模式,你分得清楚吗

本文内容来源于B站&#xff1a; 【「观察者模式」与「发布/订阅模式」&#xff0c;你分得清楚吗&#xff1f;】 文章目录 观察者模式&#xff08;Observer Pattern&#xff09;的代码优化观察者模式 与 发布订阅模式 他们是一样的吗&#xff1f;发布订阅模式总结 我们想象这样一…...

计算机毕业设计选题推荐-学院教学工作量统计系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

人机交互不仅仅是科技问题

人机交互不仅仅局限于物理和数理科学的应用&#xff0c;还涉及到更广泛的管理、文理、哲学、艺术、伦理以及法律等领域。下面这些领域在人机协同和智能系统应用中扮演着重要角色&#xff1a; 智能系统在企业管理、资源分配、决策支持等方面的应用&#xff0c;可以帮助管理者优化…...

Lua Debug.GetInfo

在 Lua 中&#xff0c;debug.getinfo 函数的第一个参数指定了要获取信息的函数的级别。这个级别是一个整数&#xff0c;表示调用栈的深度。以下是一些常见的级别和它们的含义&#xff1a; - 1&#xff1a;当前函数&#xff08;即调用 debug.getinfo 的函数&#xff09;。 - 2&a…...

每日刷题(最短路、图论)

目录 游戏 思路 代码 魔法 思路 代码 P1364 医院设置 思路 代码 P1144 最短路计数 思路 代码 游戏 I-游戏_河南萌新联赛2024第&#xff08;三&#xff09;场&#xff1a;河南大学 (nowcoder.com) 思路 利用dijkstra去寻找起点到其余所有点的最短路径&#xff0c;当…...

远程服务器训练网络之tensorboard可视化

cd到tensorboard events存储的位置 启动tensorboard tensorboard --logdir./ 得到运行结果&#xff1a; TensorBoard 1.13.1 at http://work:6006 (Press CTRLC to quit) 创建tunnel映射到本地&#xff0c;在本地ssh&#xff0c;最好使用公网地址 ssh -N -L 8080:localhost:60…...

亚马逊网站的建设和维护/网络推广法

一&#xff1a;前言 在键盘驱动代码分析的笔记中&#xff0c;接触到了input子系统。键盘驱动&#xff0c;键盘驱动将检测到的所有按键都上报给了input子系统。Input子系统是所有I/O设备驱动的中间层&#xff0c;为上层提供了一个统一的界面。例如&#xff0c;在终端系统中&…...

怎样做自己的 优惠卷网站/佛山百度网站快速排名

这里是修真院前端小课堂&#xff0c;每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析前端知识/技能&#xff0c;。 本篇分享的是&#xff1a; 如何理解盒模型及其 content、padding、border、…...

亚当学院网站建设视频教程/典型十大优秀网络营销案例

写在前面 我们先回顾一下数组中的forEach方法吧。在数组的实例上有个forEach方法供所有实例使用&#xff0c;forEach里面接收一个回调函数&#xff0c;而且回调函数默认接收三个参数&#xff1a;当前项&#xff0c;索引&#xff0c;数组 。forEach循环有个特点&#xff0c;就是…...

做网站的怎么挣钱、/下载安装

迷人的祁连山草原(三) 翻过俄博岭垭口&#xff0c;就是祁连山腹地了。 漫山遍野都是成群的牛羊。 在海拔3685米的高处&#xff0c;俯视俄博小镇&#xff0c;像树叶上歇息的一只七星瓢虫。 我们拐了弯&#xff0c;向草原深处走去。 中午&#xff0c;我们在一座桥下&#xff0c;趟…...

推广方法视频/百度快照优化培训班

Nginx1.课程目标2.Nginx的安装与启动3.Nginx静态网站部署4.Nginx反向代理与负载均衡1.课程目标 目标1&#xff1a;掌握Nginx的安装 目标2&#xff1a;掌握Nginx的静态网站部署 目标3&#xff1a;理解Nginx的反向代理与负载均衡&#xff0c;能够配置反向代理与负载均衡 2.Ngin…...

外贸建站系统源码/福州seo代理商

经典问题----MNIST dataset分类问题&#xff1a; 对于10个输出&#xff0c;我们希望对其设定以下条件&#xff1a; 1、 2、 最后一层使用Softmax输出预测分布 函数方程&#xff1a; 这样一来就能满足上述两条件。 损失函数&#xff1a;交叉熵函数和NLL...