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;

 

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

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

相关文章

未授权访问漏洞系列详解⑥!

JBoss未授权访问漏洞 JBoss是一个基于J2EE的开放源代码应用服务器&#xff0c;代码遵循LGPL许可&#xff0c;可以在任何商业应用中免费使用;JBoss也是一个管理EJB的容器和服务器&#xff0c;支持EJB1.1、EJB 2.0和EJB3规范。,默认情况下访问 http://ip:8080/jmx-console 就可以…

【Java数据结构】---初始数据结构

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 从今天开始我们就要学习Java…

Altium designer学习笔记03 -原理图绘制

原理图绘制 1. 原理图页大小设置2.原理图格点的设置3. 原理图模板的应用4. 元件的放置5.元件属性的编辑6.元件的选择、移动、旋转、镜像6.1 元件的选择6.2 元件的移动6.3 元件的旋转6.3 元件的镜像 7.元件的复制/剪切/粘贴8.元件的排列与对齐9.绘制导线的导线属性设置10.放置网…

实时数仓分层架构详解

首先&#xff0c;我们从数据仓库说起。 数据仓库的概念可以追溯到20世纪80年代&#xff0c;当时IBM的研究人员提出了商业数据仓库的概念。数据仓库概念的提出&#xff0c;是为了解决和数据流相关的各种问题&#xff0c;特别是多重数据复制带来的高成本问题。 数据仓库之父Bill …

简单反射型XSS的复现

xss反射型攻击&#xff1a; 1.最简单的漏洞复现&#xff1a; 这里我们有一个最简单的网页&#xff1a;由于地址不存在&#xff0c;所以图片加载不出来。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta…

skynet 连接redis

文章目录 概述main.luaagent.luaredis.lua 小结 概述 之前写过skynet 入门篇&#xff0c;还有skynet实操篇&#xff1b;这2篇&#xff0c;主要写了skynet如何使用&#xff0c;还有些skynet的调用流程之类。 其实&#xff0c;看过skynet的demo之后&#xff0c;发现skynet中没有…

Simulink模型开发中的一些自动化方法

随着Simulink模型的产品化开发进程&#xff0c;许多模型开发人员会关心模型的建模自动化问题。比如如何对模型中的元素进行批量查找和修改&#xff1b;如何构建自己的建模规则对模型进行检查&#xff1b;如何实现测试自动化等。在这些使用场景中我们都需要了解一些Simulink函数…

谈谈冯诺依曼体系

我们都知道冯诺依曼体系这张图最为代表性&#xff0c;而接下来我们就来浅谈一下各部分之间的作用~ 输入设备&#xff1a;键盘&#xff0c;磁盘&#xff0c;网卡&#xff0c;话筒等等 输出设备&#xff1a;磁盘&#xff0c;网卡&#xff0c;声卡&#xff0c;显示屏等等 这些硬件…

1.1、centos stream 9安装Kubernetes v1.30集群 环境说明

最近正在学习kubernetes&#xff0c;买了一套《Kubernetes权威指南 从Docker到Kubernetes实践全接触(第六版)》这本书讲得很好&#xff0c;上下两册&#xff0c;书中k8s的版本是V1.29&#xff0c;目前官网最新版本是v1.30。强烈建议大家买一套看看。 Kubernetes官网地址&#x…

sql注入——二次注入

二次注入 简介工具环境具体实施 简介 二次注入是一种较为隐蔽的 SQL 注入攻击方式。它并非直接在输入时进行攻击&#xff0c;而是先将恶意数据存储到数据库中&#xff0c;这些数据看似正常。随后&#xff0c;应用程序在后续的操作中&#xff0c;再次使用或处理这些之前存储的恶…

消息队列:Kafka吞吐量为什么比RocketMQ大

根据资料显示RocketMQ每秒能处理10W量级数据&#xff0c;而Kafka能处理17W量级数据。 这两者差别主要再使用的零拷贝技术不一样。 再什么情况下零拷贝技术诞生了 为了防止消息队列中的消息因为各种意外情况丢失&#xff0c;要对消息进行持久化处理&#xff0c;将其存储在磁盘…

NLP——文本预处理

本文思维导图 文本预处理及其作用 文本语料在输送给模型前一般需要一系列的预处理工作, 才能符合模型输入的要求, 如: 将文本转化成模型需要的张量, 规范张量的尺寸等, 而且科学的文本预处理环节还将有效指导模型超参数的选择, 提升模型的评估指标. 一、文本处理的基本方法 1…

C++ | Leetcode C++题解之第326题3的幂

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isPowerOfThree(int n) {return n > 0 && 1162261467 % n 0;} };

【TS】declare 全局声明方式

declare关键字 declare是描述TS文件之外信息的一种机制&#xff0c;它的作用是告诉TS某个类型或变量已经存在&#xff0c;我们可以使用它声明全局变量、函数、类、接口、类型别名、类的属性或方法以及后面会介绍的模块与命名空间。 declare关键字用来告诉编译器&#xff0c;某…

工业控制常用的EtherNet/IP、OPC UA协议的标签数据转发到另外的PLC寄存器地址

在工业自动化领域&#xff0c;越来越多的碰到标签方式通讯的设备&#xff0c;常用有CIP(基于EtherNet/IP) 的协议、OPCUA协议等&#xff0c;CIP协议主要是罗克韦尔/AB的PLC、欧姆龙NX/NJ系列的PLC等&#xff0c;OPCUA协议常见于工业机器人、智能焊接设备等。在不具备标签协议接…

C语言 ——深入理解指针(2)

目录 1. 数组名的理解2. 二级指针3. 指针数组4. 字符指针变量5. 数组指针变量6. 函数指针变量7. 函数指针数组 1. 数组名的理解 这里我们使用 &arr[0] 的方式拿到了数组第一个元素的地址&#xff0c;但是其实数组名本来就是地址&#xff0c;而且是数组首元素的地址&#x…

普华-PowerPMS APPGetUser SQL注入致RCE漏洞复现

0x01 产品简介 PowerPMS是上海普华科技自主研发的移动端工程项目管理产品。支持中英文切换,可与普华PowerOn、PowerPiP系列产品配套使用。产品与工程项目为核心,为项目各参建方提供包括任务管理、文档管理、质量检查、安全检查、施工日志、进度反馈、即时消息等功能在内的服…

Rust 所有权

所有权 Rust的核心特性就是所有权所有程序在运行时都必须管理他们使用计算机内存的方式 有些语言有垃圾收集机制&#xff0c;在程序运行时&#xff0c;他们会不断地寻找不再使用的内存在其他语言中&#xff0c;程序员必须显式的分配和释放内存 Rust采用了第三种方式&#xff1…

鲁班上门维修安装系统源码开发之功能模式

鲁班上门维修安装系统在当今的趋势呈现出显著的增长与创新。随着物联网、智能家居的普及&#xff0c;以及消费者对便捷、高效生活方式的追求&#xff0c;鲁班上门维修安装系统凭借其多渠道预约、智能派单、在线支付与费用明细透明等优势&#xff0c;赢得了市场的广泛认可。 …

【13.PIE-Engine案例——加载Landsat8 Collection2 SR数据集】

原始链接 原始路径欢迎大家登录航天宏图官网查看本案例原始来源 结果展示 具体代码 /*** File : Landsat8 Collection2 SR* Time : 2021/5/24* Author : piesat* Version : 1.0* Contact : 400-890-0662* License : (C)Copyright 航天宏图信息技术股份有…