认识发布者/订阅者模式

发布者定义一系列事件,并提供一个注册方法;

订阅者发布者注册自己的事件处理逻辑,供一个可被回调的方法,也就是事件处理程序;当发布者的事件被触发的时候,订阅者将通过回调函数得到发布者通知,而订阅者所注册的回调函数,也就是事件处理逻辑的所有方法都会被执行

  • 发布者是指拥有某事件的类或者结构
  • 订阅者是指向发布者注册的类或者结构
  • 事件处理程序是指由订阅者注册到事件的方法,在发布者触发事件时执行

参考: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#中的事件的订阅与发布的更多相关文章

  1. 【C#】Event事件的订阅和发布

    学习笔记:学习了委托和事件的用法.事件是一种特殊的委托,记录下事件从订阅到发布的流程. 学习资料源于视频:http://www.maiziedu.com/course/510-6891/ 新建一个De ...

  2. 在php中实现Redis的订阅与发布

    <?php //require_once dirname(__FILE__).'/class/RedisClass.class.php'; function init_redis(){ $red ...

  3. VB.net Wcf事件广播(订阅、发布)

    这篇东西原写在csdn.net上,最近新开通了博客想把零散在各处的都转移到一处.   一.源起 学WCF有一段时间了,可是无论是微软的WebCast还是其他网上的教程,亦或我购买的几本书中,都没有怎么 ...

  4. 使用MediatR重构单体应用中的事件发布/订阅

    标题:使用MediatR重构单体应用中的事件发布/订阅 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/10640280.html 源代码:https ...

  5. Redis实战——Redis的pub/Sub(订阅与发布)在java中的实现

    借鉴:https://blog.csdn.net/canot/article/details/51938955 1.什么是pub/sub Pub/Sub功能(means Publish, Subscr ...

  6. 领域驱动模型DDD(二)——领域事件的订阅/发布实践

    前言 凭良心来说,<微服务架构设计模式>此书什么都好,就是选用的业务过于庞大而导致代码连贯性太差,我作为读者来说对于其中采用的自研框架看起来味同嚼蜡,需要花费的学习成本实在是过于庞大,不仅 ...

  7. C#中的委托、事件及事件的订阅

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. 初步揭秘node.js中的事件

    当你学习node.js的时候,Events是一个非常重要的需要理解的事情.非常多的Node对象触发事件,你能在文档API中找到很多例子.但是关于如何写自己的事件和监听,你可能还不太清楚.如果你不了解, ...

  9. 三种方式实现观察者模式 及 Spring中的事件编程模型

    观察者模式可以说是众多设计模式中,最容易理解的设计模式之一了,观察者模式在Spring中也随处可见,面试的时候,面试官可能会问,嘿,你既然读过Spring源码,那你说说Spring中运用的设计模式吧, ...

随机推荐

  1. [技术博客]ubuntu+nginx+uwsgi+Django+https的部署

    ubuntu+nginx+uwsgi+Django+https部署文档 配置机器介绍 操作系统:Ubuntu 18.04.2 LTS 64位 python版本:Python 3.6.7 Django版 ...

  2. Java编程思想之十二 通过异常处理错误

    Java的基本概念是结构不佳的代码不能运行余下的问题必须在运行期间解决,这就需要错误源能通过某种方式,把适当的信息传递给某个接收者--该接收者将知道如何正确处理这里问题. 12.1 概念 使用异常所带 ...

  3. android webview 全屏100%显示图片

    这里引用 第三方类库 implementation 'org.jsoup:jsoup:1.10.2' 定义工具类 HtmlUtils import org.jsoup.Jsoup; import or ...

  4. Buttons按扭

    到目前为此,我们已经写了一些程序代码,但都只是输出,然而,有时我们也希望板子能处理一些输入,输入输出我们都是针对板子来说的.microbit板子上的两个按键是最显眼的输入,分别是A和B,mPython ...

  5. Functional-Light-JS 摘录笔记(1)

    function foo(...args) { console.log( args[3] ); } var arr = [ 1, 2, 3, 4, 5 ]; foo( ...arr ); Think ...

  6. idea Autowired 提示红色的解决方式

  7. Flink 源码解析 —— 项目结构一览

    Flink 源码项目结构一览 https://t.zsxq.com/MNfAYne 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...

  8. 不一样的LCA——luoguP1852跳跳棋

    洛谷端题目链接 loj端题目链接 题目大意: 在一条数轴上进行跳跳棋游戏.棋子只能摆在整点上.每个点不能摆超过一个棋子.用跳跳棋完成:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动 ...

  9. python实现根据前序与中序求后序

    我就不板门弄斧了求后序 class Tree(): def __init__(self,x): self.value=x self.left=None self.right=None class So ...

  10. 『一维线性dp的四边形不等式优化』

    四边形不等式 定义:设\(w(x,y)\)是定义在整数集合上的的二元函数,若对于定义域上的任意整数\(a,b,c,d\),在满足\(a\leq b\leq c \leq d\)时,都有\(w(a,d) ...