C#中的事件的订阅与发布
认识发布者/订阅者模式
发布者定义一系列事件,并提供一个注册方法;
订阅者向发布者注册自己的事件处理逻辑,供一个可被回调的方法,也就是事件处理程序;当发布者的事件被触发的时候,订阅者将通过回调函数得到发布者通知,而订阅者所注册的回调函数,也就是事件处理逻辑的所有方法都会被执行
- 发布者是指拥有某事件的类或者结构
 - 订阅者是指向发布者注册的类或者结构
 - 事件处理程序是指由订阅者注册到事件的方法,在发布者触发事件时执行
 
参考:https://blog.csdn.net/weixin_38486884/article/details/82853508
从一个简单的例子,来说明一下这种事件消息传递的机制!
有一家三口,妈妈负责做饭,爸爸和孩子负责吃。。。将这三个人,想象成三个类。
妈妈有一个方法,叫做“做饭”。有一个事件,叫做“开饭”。做完饭后,调用开饭事件,发布开饭消息。
爸爸和孩子分别有一个方法,叫做“吃饭”。
将爸爸和孩子的“吃饭”方法,注册到妈妈的“开饭”事件。也就是,订阅妈妈的开饭消息。让妈妈做完饭开饭时,发布吃饭消息时,告诉爸爸和孩子一声。
这种机制就是C#中的,订阅发布。下面我们用代码实现:
class Program
{
public static void Main(string[] args)
{
//实例化对象
Mom mom = new Mom();
Dad dad = new Dad();
Child child = new Child(); //将爸爸和孩子的Eat方法注册到妈妈的Eat事件
//订阅妈妈开饭的消息
mom.Eat += dad.Eat;
mom.Eat += child.Eat; //调用妈妈的Cook事件
mom.Cook(); Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
} public class Mom
{
//定义Eat事件,用于发布吃饭消息
public event Action Eat; public void Cook()
{
Console.WriteLine("妈妈 : 饭好了");
//饭好了,发布吃饭消息
Eat?.Invoke();
}
} public class Dad
{
public void Eat()
{
//爸爸去吃饭
Console.WriteLine("爸爸 : 吃饭了。");
}
} public class Child
{
public void Eat()
{
//熊孩子LOL呢,打完再吃
Console.WriteLine("孩子 : 打完这局再吃。");
}
}
运行结果:

当爷爷奶奶来做客了怎么办呢?和爸爸孩子一样,写个Eat方法,同样注册到妈妈的开饭事件就好了。
出处:https://www.cnblogs.com/David-Huang/p/5150671.html
====
C#中的事件的订阅与发布的更多相关文章
- 【C#】Event事件的订阅和发布
		
学习笔记:学习了委托和事件的用法.事件是一种特殊的委托,记录下事件从订阅到发布的流程. 学习资料源于视频:http://www.maiziedu.com/course/510-6891/ 新建一个De ...
 - 在php中实现Redis的订阅与发布
		
<?php //require_once dirname(__FILE__).'/class/RedisClass.class.php'; function init_redis(){ $red ...
 - VB.net Wcf事件广播(订阅、发布)
		
这篇东西原写在csdn.net上,最近新开通了博客想把零散在各处的都转移到一处. 一.源起 学WCF有一段时间了,可是无论是微软的WebCast还是其他网上的教程,亦或我购买的几本书中,都没有怎么 ...
 - 使用MediatR重构单体应用中的事件发布/订阅
		
标题:使用MediatR重构单体应用中的事件发布/订阅 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/10640280.html 源代码:https ...
 - Redis实战——Redis的pub/Sub(订阅与发布)在java中的实现
		
借鉴:https://blog.csdn.net/canot/article/details/51938955 1.什么是pub/sub Pub/Sub功能(means Publish, Subscr ...
 - 领域驱动模型DDD(二)——领域事件的订阅/发布实践
		
前言 凭良心来说,<微服务架构设计模式>此书什么都好,就是选用的业务过于庞大而导致代码连贯性太差,我作为读者来说对于其中采用的自研框架看起来味同嚼蜡,需要花费的学习成本实在是过于庞大,不仅 ...
 - C#中的委托、事件及事件的订阅
		
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
 - 初步揭秘node.js中的事件
		
当你学习node.js的时候,Events是一个非常重要的需要理解的事情.非常多的Node对象触发事件,你能在文档API中找到很多例子.但是关于如何写自己的事件和监听,你可能还不太清楚.如果你不了解, ...
 - 三种方式实现观察者模式 及 Spring中的事件编程模型
		
观察者模式可以说是众多设计模式中,最容易理解的设计模式之一了,观察者模式在Spring中也随处可见,面试的时候,面试官可能会问,嘿,你既然读过Spring源码,那你说说Spring中运用的设计模式吧, ...
 
随机推荐
- mac系统中怎么打开rar/zip等压缩文件?
			
平常使用mac的同学们,可能经常要接受下别人发过来的rar文件,可惜的时mac os x系统默认是不能打开rar文件(不知道以后苹果会支持rar不?),那么我们该如何去解圧rar文件,接下来我将介绍. ...
 - 【06月10日】A股ROE最高排名
			
个股滚动ROE = 最近4个季度的归母净利润 / ((期初归母净资产 + 期末归母净资产) / 2). 查看更多个股ROE最高排名 兰州民百(SH600738) - ROE_TTM:86.45% - ...
 - Linux内核kobject结构体分析
			
1.前言 Linux内核中有大量的驱动,而这些驱动往往具有类似的结构,根据面向对象的思想,可以将共同的部分提取为父类,而这个父类就是kobject,kobject结构体中包含了大量设备的必须信息,而三 ...
 - [转帖]Kubesphere all-in-one 安装方式.
			
All-in-One 模式 对于首次接触 KubeSphere 高级版的用户,想寻找一个最快安装和体验 KubeSphere 高级版核心功能的方式,all-in-one 模式支持一键安装 KubeSp ...
 - Python开发【第十二篇】python作用域和global nonlocal
			
python的作用域 作用域也叫名字空间,是访问变量时查找变量名的范围空间 python中的四个作用域 LEGB 作用域 英文解释 英文缩写 局部作用域 Local(function) L 外部嵌套函 ...
 - java中什么是抽象类(abstract)
			
一.什么是抽象类 由abstract修饰的方法叫抽象方法:由abstract修饰的类叫抽象类.抽象的类无法进行实例化,因为他不是具体存在的类,或者说这样的类还不够完善,不能直接使用new关键字调用其构 ...
 - 配置 Log4j 以便查看 MyBatis 操作数据库的过程
			
在 src/main/resources中添加 log4j.properties 配置文件 ,输入如下内 容.#全局面已直 log4j .rootLogger=ERROR, stdout #MyBat ...
 - django子应用
			
在Web应用中,通常有一些业务功能模块是在不同的项目中都可以复用的,故在开发中通常将工程项目拆分为不同的子功能模块,各功能模块间可以保持相对的独立,在其他工程项目中需要用到某个特定功能模块时,可以将该 ...
 - vue中自定义指令
			
//vue中自定义指令 //使用 Vue.directive(id, [definition]) 定义全局的指令 //参数1:指令的名称.注意,在定义的时候,指令的名称前面,不需要加 v-前缀; 但是 ...
 - js中 !==和 !=的区别是什么
			
1.比较结果上的区别 !=返回同类型值比较结果. !== 不同类型不比较,且无结果,同类型才比较. 2.比较过程上的区别 != 比较时,若类型不同,会偿试转换类型. !== 只有相同类型才会比较. 3 ...