Windows程序最基本的原理是“以消息为基础,以事件驱动之(Message Based, Event Driven)”。程序的运行是要靠外部发生的事件来驱动的,也就是说程序需要不断等待任何可能的输入(以消息的形式描述的外部所发生的事件),然后做判断,然后再做适当的处理。接受并处理消息的主角是窗口,每一个窗口都应该有一个函数(方法)负责处理消息。如果窗口获得一个消息,则这个窗口函数必须判断消息的类别,然后决定处理的方式。这个函数就是所谓的窗口函数(Window Procedure,或称Window Function,该函数是一个回调函数),所以事件(Event)实际上就是一个回调(callback)的函数指针(Function Pointer),在C#中是用委托(Delegate)类型来实现的。

推荐的事件发布设计模式如下:

×设计EventArgs类,封装需要发送给事件接受者的数据

×定义一个委托类型,用于指定事件触发时被调用的方法原型

×定义一个事件成员(event关键字)

×定义一个触发事件的方法,负责通知事件的登记对象

×定义一个方法,转化程序收到的外部输入为事件格式,以产生能够触发事件的动作

完成订阅事件需要两步:

1.在事件订阅者的类型中定义事件处理方法(Event Handler)

2.向事件发行者订阅事件

具体“发布事件”和订阅事件的一个例子参考如下:

public struct QuitPerson        //Information Carrier

{

public String Name;

public String Station;

}

public class CPeter             //event distributor

{

public class CQuitHireEventArgs: EventArgs

{

public CQuitHireEventArgs(QuitPerson aquitPerson)

{

this.quitPerson = aquitPerson;

}

public readonly QuitPerson quitPerson;

}

public delegate void QuitHireEventHandler(Object sender, CQuitHireEventArgs e);

public event QuitHireEventHandler OnQuitHire;     //define event member

protected virtual void QuitHire(CQuitHireEventArgs e)

{

if(OnQuitHire != null) OnQuitHire(this, e);

}    //event notify register

public void setOnQuitHire(QuitPerson quitPerson)

{

CQuitHireEventArgs e = new CQuitHireEventArgs(quitPerson);

QuitHire(e);

}    //action that trigger event

}  //End of Event Distributer "CPeter"

//below are event receivers

public class CCeo

{

public CCeo(CPeter peter)

{

peter.OnQuitHire += new CPeter.QuitHireEventHandler(ReportCeoQH);

}

public void ReportCeoQH(Object sender, CPeter.CQuitHireEventArgs e)

{

Console.WriteLine("report to CEO:\n dismission person {0}, station {1}\n", e.quitPerson.Name, e.quitPerson.station);

}

}

public class CHRManager

{

public CHRManager(CPeter peter)

{

peter.OnQuitHire += new CPeter.QuitHIreEventHandler(ReportHRMangerQH);

}

public void ReportHRmanagerQH(Object sender, CPeter.CQuitHireEventArgs e)

{

Console.WriteLine("report to HR:\n dismission person {0}, station {1}\n", e.quitPerson.Name, e.quitPerson.station);

}

}

//use example

Class CAppRun

{

[STAThread]

static void main(String[] args)

{

QuitPerson quitPerson;

quitPerson.Name = "Wat, Kidsoul Jian Jun";

quitPerson.Station = "Project Manager";

CPeter peter = new CPeter();

CCeo ceo = new CCeo(peter);

CHRManager = new CHRManager(peter);

peter.SetOnQuitHire(quitPerson);

Console.Read();

}

}

c#事件的发布-订阅模型_C#事件发布设计模式相关推荐

  1. c#事件的发布-订阅模型_C#事件订阅发布实现原理详解

    我们用一个简单的例子,来说明一下这种消息传递的机制. 有一家三口,妈妈负责做饭,爸爸和孩子负责吃...将这三个人,想象成三个类. 妈妈有一个方法,叫做"做饭".有一个事件,叫做&q ...

  2. c#事件的发布-订阅模型_C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命...

    使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠 ...

  3. vue发布订阅模式,发布订阅模型

    1.什么是发布订阅模式 (又叫做观察者模式) 他定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都将得到通知. 2.发布订阅模型 1.发布者会给订阅者提供一个方法以便 ...

  4. kafka 发布订阅_在Kafka中发布订阅模型

    kafka 发布订阅 这是第四个柱中的一系列关于同步客户端集成与异步系统( 1, 2, 3 ). 在这里,我们将尝试了解Kafka的工作方式,以便正确利用其发布-订阅实现. 卡夫卡概念 根据官方文件 ...

  5. 在Kafka中发布订阅模型

    这是第四个柱中的一系列关于同步客户端集成与异步系统( 1, 2, 3 ). 在这里,我们将尝试了解Kafka的工作方式,以便正确利用其发布-订阅实现. 卡夫卡概念 根据官方文件 : Kafka是一种分 ...

  6. java实现rabbitmq发布/订阅模型(Publish/Subscribe queues), 生产者 消费者 交换机 消息队列

    发布/订阅模型又称扇出模型,或者是广播模型,可以有多个消费者,每个消费者有自己的队列,每个队列都要绑定到交换机,生产者发送的消息只需要发送到交换机,再由交换机决定要发送到哪些队列,生产者无法自行决定. ...

  7. 分布式发布订阅模型网络的实现有哪些

    大数据中常用的分布式发布订阅系统: 参考资料: WCF百科介绍 分布式"消息发布者-订阅者"模型的实现--WCF双工通讯特性的应用 [设计模式] 观察者模式(发布-订阅/Publi ...

  8. 3,ActiveMQ-入门(基于JMS发布订阅模型)

    一.Pub/Sub-发布/订阅消息传递模型 在发布/订阅消息模型中,发布者发布一个消息,该消息通过topic传递给所有的客户端.在这种模型中,发布者和订阅者彼此不知道对方,是匿名的且可以动态发布和订阅 ...

  9. ros 单向通讯 talker,listener 发布订阅模型

    原文链接: ros 单向通讯 talker,listener 发布订阅模型 上一篇: VirtualBox 端口转发(端口映射) 主机和虚拟机相互访问 下一篇: python 串口编程 发布订阅模型 ...

最新文章

  1. 考题:正则表达式 .*? 和 .* 有区别吗?
  2. 假笨说-从一起GC血案谈到反射原理
  3. mysql自动提交 dcl语句_MySQL基础:DCL语句总结
  4. Apache ab测试工具使用方法(无参、get传参、post传参)
  5. oracle 条件查询加排序,Java乔晓松-oracle的条件查询和排序查询
  6. 由更改密码引发的状况..(alter user xxx identified by password)
  7. 11.Excel数据分析-复合型饼图与漏斗图
  8. 飞鸽传书从天齐庙南门出来
  9. admin 系统被嵌套在第三方系统中的跨域异常
  10. 沈向洋、王海峰候选中国工程院院士!计算机领域7位入围增选
  11. Win32项目生成的程序exe图标显示异常的问题
  12. 关于c3p0连接池连接mysql数据库需要注意的几点
  13. HTML入门学习 -- HTML5 视频与音频
  14. oracle判断字符串以什么开头_sql语句判断字符串以什么什么开头
  15. 戏说面向对象程序设计
  16. HTML作业制作服装推广软文,盘点:服装推广软文写作技巧
  17. 计算机ppt用快捷键,【搞定PPT】高效重复快捷键F4
  18. 解决Ubuntu与Windows不能复制粘贴问题
  19. 【MQ-2 可燃气体和烟雾传感器与 Arduino 配合使用】
  20. 还在为图片转Excel而烦恼?6种转换方法让你3秒实现转换

热门文章

  1. 腾讯云mysql数据库迁移至CVM自建数据库
  2. 中国农民丰收节精神 2020(广东)功能性农业·农业大健康大会
  3. Angular模板引用变量(#var)
  4. 如何制作一张自动汇总表格,搞定所有Excel表格数据汇总问题
  5. pytorch JIT
  6. 类ChatGPT逐行代码解读(2/2):从零起步实现ChatLLaMA和ColossalChat
  7. CSP认证题解第一题
  8. 2021湖北天门高考理科成绩查询,2021年天门市高考状元名单资料,今年天门市高考状元多少分...
  9. 亚马逊批量注册账号流程
  10. wr720n改无线打印服务器,tplink如何关闭dhcp