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

news2024/9/22 0:51:48

前言:

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

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


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.coloradmin.cn/o/1967219.html

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

相关文章

软件测试的挑战和压力

软件测试过程中可能会遇到很多挑战&#xff0c;比如&#xff1a; 1. 需求不明确或不稳定。如果需求文档不完整、不清晰或不一致&#xff0c;或者需求在开发过程中频繁变更&#xff0c;那么测试人员就很难设计和执行有效的测试用例&#xff0c;也很难判断测试结果是否符合预期。…

5年经验的软件测试人员,碰到这样的面试题居然会心虚......

我们这边最近的面试机会比较多&#xff0c;但是根据他们的反馈&#xff0c;结束后大部分都没音信了&#xff0c;因为现在企业面试问的非常多&#xff0c;范围非常广&#xff0c;而且开放性的问题很多&#xff0c;很多人即便面试前刷了成百上千道面试题&#xff0c;也很难碰到一…

C语言——指针数组

文章目录 &#x1f34a;自我介绍&#x1f34a;前言&#x1f34a;含义&#x1f34a;输出指针数组中的值&#x1f34a;指针数组工程的用法&#xff08;模拟linux的内核代码&#xff09; 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&…

实习中学到的一点计算机知识(MP4在企业微信打不开?)

我在实习中&#xff0c;常有同事向我反馈说我在微信发的视频格式打不开。这就导致我还要一帧帧的盯着某一个时刻来截图&#xff0c;今天查了一下资料尝试修改视频后缀来解决视频的播放问题。 在网上下载mp4的格式&#xff0c;在本地都能播放&#xff0c;怎么可能发上企业微信就…

使用CLI脚手架搭建Vue2项目

一、配置前端的环境 1、下载安装Node.js 网址&#xff1a;Node.js 中文网 (nodejs.com.cn) 参考&#xff1a;【简明图文教程】Node.js的下载、安装、环境配置及测试_node下载安装-CSDN博客 推荐安装路径C盘改为D盘 2、配置nodejs及环境变量【安装的时候勾选Add to PATH就不…

[算法]归并排序(C语言实现)

一、归并排序的定义 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法。该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。 二、归并排序的算法原理 归并排序的算法可以用递归法和非递归法来实现…

2024新版python安装教程【附图片】

Python的安装步骤因操作系统而异&#xff0c;但大致可以分为下载、安装和验证三个主要步骤。以下是Windows系统中Python的详细安装步骤&#xff1a; Windows系统 下载Python安装包 访问Python官网&#xff08;https://www.python.org/&#xff09;。点击页面头部的“Download…

【优秀python django系统案例】基于python的医院挂号管理系统,角色包括医生、患者、管理员三种

随着信息技术的迅猛发展&#xff0c;传统的医院挂号管理方式面临着效率低下、排队时间长、信息不对称等诸多问题。这些问题不仅影响患者的就医体验&#xff0c;也加重了医院工作人员的负担。在此背景下&#xff0c;基于Python的医院挂号管理系统应运而生。该系统旨在通过信息化…

OZON饰品产品什么好卖,OZON热销饰品有哪些

在OZON平台上&#xff0c;饰品产品的销售情况受多种因素影响&#xff0c;包括市场需求、季节变化、消费者偏好以及流行趋势等。以下是一些可能热销的OZON饰品产品类别及具体推荐&#xff1a; OZON热销饰品地址&#xff1a;D。DDqbt。COm/74rDTop1 发带套装 Утика Ком…

Idea常用快捷键:设置自动导包、格式化、抽取方法

Idea设置自动导包 【File】→【Setting】(或使用快捷键【Crlt Shift S】)打开Setting设置。点击【Editor】→【General】→【Auto Import】。勾选自定导包的选项&#xff0c;并确定&#xff0c;如下&#xff1a; Addunambiguousimportsonthefly&#xff1a;添加明确的导入 …

CSP-J 2022基础知识答案与解析

1.以下哪种功能没有涉及 C语言的面向对象特性支持&#xff1a;&#xff08; &#xff09;。 (2 分) A.C中调用 printf 函数 B.C中调用用户定义的类成员函数 C.C中构造一个 class 或 struct D.C中构造来源于同一基类的多个派生类 解析&#xff1a;printf是继承自C的&#…

vue2学习 -- 核心语法(二)

文章目录 1. 绑定样式1.1 绑定class1.2 绑定style 2. 渲染2.1 条件渲染2.2 列表渲染key的作用 3. 监视数据3.1 vue监视数据的原理_对象3.2 vue监视数据的原理_数组 4. 收集表单数据5. 过滤器6. 指令6.1 内置指令6.2 自定义指令 7. 生命周期 1. 绑定样式 1.1 绑定class 三种写…

基于LK光流提取算法的图像序列晃动程度计算matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 光流的概念 4.2 基于LK光流算法的图像序列晃动程度计算 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &…

前方高能!2024 MongoDB中国用户大会正式官宣!

前方重磅&#xff01; 2024 MongoDB 中国用户大会 正式官宣&#xff01; 聆听最新产品发布与主题演讲 get行业头部客户案例的精彩分享 与各届优秀同行们现场交流⼼得 与资深MongoDB⼯程师面对面答疑解惑 ⼀起把MongoDB的酷炫周边收⼊囊中&#xff01; …… 欢迎所有Mong…

告别单一渠道,全渠道整合营销让企业营销力MAX!

现阶段&#xff0c;企业纷纷积极寻求新的道路&#xff0c;以拓展国际市场、增强品牌影响力。今天咱们来聊聊全渠道营销那点事儿&#xff0c;特别是对那些想出海闯荡一番的中国企业来说&#xff0c;这可是个必备神器&#xff01;NetFarmer专门企业搞定数字化出海&#xff0c;现在…

室内养猫空气净化器哪个好?真实室内养猫空气净化器使用评价

作为一个养猫多年的猫奴&#xff0c;家里有两只可爱的小猫咪&#xff1a;小白和小花。虽然相处起来很开心&#xff0c;但也给生活带来了一些小麻烦。感受一下40度高温的养猫人&#xff0c;给掉毛怪疏毛浮毛飘飘&#xff0c;逃不过的饮水机&#xff0c;各个角落&#xff0c;多猫…

七夕节高逼格表白方式,送给你的那个TA(可写字版)

别人都有爱心代码了&#xff0c;咱们开发者们也必须有。今天给大家分享个用 Python 写的爱心代码项目&#xff0c;如果感兴趣或者想给自己的另一半制造小浪漫的同学可以自己上手试一试。 运行结果 ** 温馨提示&#xff1a;篇幅有限&#xff0c;源码已打包文件夹&#xff0c;获…

ECRS工时分析软件:工业工程精益生产的智慧引擎

在工业工程学的广阔领域中&#xff0c;程序分析一直扮演着至关重要的角色。其中&#xff0c;ECRS四大原则——取消、合并、重排、简化&#xff0c;作为程序分析的核心&#xff0c;旨在通过优化生产过程&#xff0c;实现成本的节省和精益生产的目标。如今&#xff0c;随着科技的…

【C++】C++入门知识详解(下)

大家好~我们接着【C】C入门知识详解&#xff08;上&#xff09;-CSDN博客来介绍另一些C入门基础知识。 1.缺省值和缺省参数 缺省参数就是声明或定义函数时为函数的参数指定一个缺省参数。在调用该函数时&#xff0c;如果没有指定实参&#xff0c;则采用该形参的缺省值&#xf…

ChatGPT:GPT,GPT2,GPT3,Prompt

1&#xff0c;GPT 1.1&#xff0c;GPT结构 GPT is short for Generative Pretrained Transformer。其实GPT和BERT的区别就写在他们的脸上。GPT是Generative的&#xff0c;目的就是要生成。它是一个预训练的Transformer&#xff0c;因为目的就是要生成&#xff0c;所以是Decode…