当前位置: 首页 > news >正文

.NET中的Event与Delegates,从Publisher到Subscriber的衔接!


今天复习了一下C#中的Delegates与Event Handler,整理一下思路如下:

1. 使用Delegates进行事件处理,一般遵循下面的模式:

我们将事件的发起者(Event Source)称为Publisher,将事件的处理者(Event Handler)称为Subscriber.


2. 具体的做法,用一个简单的例子来看如何进行事件的封装处理!


鲨鱼正在网上潜水,突然他决定出门(Event),他会有什么动作呢(Event Handler)?
---> 决定出门了....(一个外部调用...sharkMind.DecideGetOut())
---> 鲨鱼的脑子产生一些生物电... (一个事件激发了... OnGetOut)
---> 谁来做处理,丢给神经系统吧...(一个delegate要负责传递指令....GetOutEventHandler)
---> 具体如何做,当然是鲨鱼的身体啦...(sharkBody.OpenDoor())
---> 一个事件可能需要好几个动作处理哦,所以我需要:开门,放下东西,关门!


2.1 纵观一下整个事件的处理过程...
filename: Program.cs

class Program {
static void Main(string[] args) {
//鲨鱼的脑袋,算是一个事件发起者,the Publisher.
GetOutPublisher sharkMind = new GetOutPublisher();

//鲨鱼的身体,算是一个事件处理者,the Subscriber.
GetOutSubscriber sharkBody = new GetOutSubscriber();

//建立鲨鱼的神经系统单元
GetOutEventHandler eventAction1 = new GetOutEventHandler(sharkBody.OpenTheDoor);
GetOutEventHandler eventAction2
= new GetOutEventHandler(sharkBody.PutDownWhat);
GetOutEventHandler eventAction3
= new GetOutEventHandler(sharkBody.CloseTheDoor);

//把鲨鱼的神经系统单元与脑子联系起来, 即为将事件处理动作注册到事件委托中.
sharkMind.OnGetOutHandler += eventAction1;
sharkMind.OnGetOutHandler
+= eventAction2;
sharkMind.OnGetOutHandler
+= eventAction3;

//外面天气不错,我决定出去走走,于是产生一系列的事件处理!
sharkMind.DecideGetOut();
}
}

2.2 剖析整个组成...先从delegate开始,为了能够封装事件,我们需要先定义一个delegate:
   delegate void GetOutEventHandler(Object source, GetOutEventArgs e);
2.3 假定你的事件处理的时候,还需要传递一些参数,所以我们还需定义一个EventArgs,
就算出门的时候带什么东西吧~~~ ^ ^!
filename:GetOutEventArgs.cs

class GetOutEventArgs : System.EventArgs {
// 出门带啥东西呢?
private string _takeWhat;

public GetOutEventArgs() {
this._takeWhat = "Nothing";
}

public GetOutEventArgs(string strTakeWhat) {
if (strTakeWhat.Equals("")) {
this._takeWhat = "Nothing";
}
else {
this._takeWhat = strTakeWhat;
}
}

public string TakeWhat {
get {
return _takeWhat;
}
set {
_takeWhat
= value;
}
}
}

2.4 对应出去,我们就局限下面的响应动作了:
filename:GetOutSubscribe.cs

    
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->
class GetOutSubscriber {
public void OpenTheDoor(Object source, GetOutEventArgs e) {
// 开门...
Console.WriteLine( " Open the door... " );
}

public void PutDownWhat(Object source, GetOutEventArgs e) {
// 放下手中的东西...
Console.WriteLine( " Put down " + e.TakeWhat + "...");
}

public void CloseTheDoor(Object source, GetOutEventArgs e) {
// 关门...
Console.WriteLine( " Close the door... " );
}
}

2.5 事件是如何产生的
filename:GetOutPublisher.cs

    
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->
class GetOutPublisher {
// Publisher 说:喂,我有一个事件,谁来处理?
public event GetOutEventHandler OnGetOutHandler;

// Publisher 产生具体的事件
protected void OnGetOut(GetOutEventArgs e) {
// 有谁来负责处理事件吗?
if ( null != this .OnGetOutHandler) {
// 让他们来处理吧...
OnGetOutHandler( this , e);
}
}

// 对外公开的接口,调用此方法会产生事件.
public void DecideGetOut() {
OnGetOut(
new GetOutEventArgs());
}

}

2.6 当有了上面的Publisher与Subscriber后,要把它们串起来,需要遵循下面的过程:

Step 1:建立Publisher Instance,即Event Source
Step 2:建立Subscriber Instance,即Event Handler
Step 3:建立一个Delegate,来承接Subscriber的具体动作
Step 4:把建立的Delegate与Event进行绑定,我们称之为register
Step 5:外部调用,产生Event,所有的Event Handler收到通知,开始执行

具体可以参考2.1中的主函数的步骤!

2.7 运行的结果如下:

Open the door...
Put down Nothing...
Close the door...


相关文章:

  • 略时间中秒的部分,使时间中的秒变成0
  • 不可忽视的力量,插件主题网站
  • 日期只精确到天 省略时间的时间部分
  • 10月7日培训日记
  • Xcode6建的工程修改为在iPhone6和iPhone6P下等比放大
  • iOS7以上使导航栏半透明
  • 过程建模EPC,我拿什么拯救你
  • 用图作背景的cell选中时背景图变暗
  • Guru.com - The world's largest online marketplace for freelance talent.
  • view controller的automaticallyAdjustsScrollViewInsets属性
  • Blog小技巧之三-在地图上显示访问Blog读者的分布信息
  • 简单的在工程中集成RAC
  • 10月8日培训日记
  • 聚合优于继承
  • 数据源变更时,table中更新对应cell的显示
  • 自己简单写的 事件订阅机制
  • 【笔记】你不知道的JS读书笔记——Promise
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 30秒的PHP代码片段(1)数组 - Array
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • ECS应用管理最佳实践
  • export和import的用法总结
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • idea + plantuml 画流程图
  • java第三方包学习之lombok
  • KMP算法及优化
  • laravel 用artisan创建自己的模板
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 复杂数据处理
  • 开发基于以太坊智能合约的DApp
  • 如何利用MongoDB打造TOP榜小程序
  • 一份游戏开发学习路线
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​渐进式Web应用PWA的未来
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #100天计划# 2013年9月29日
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $.ajax()方法详解
  • (1)(1.13) SiK无线电高级配置(五)
  • (2015)JS ES6 必知的十个 特性
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (全注解开发)学习Spring-MVC的第三天
  • (已解决)什么是vue导航守卫
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)一些感悟
  • .form文件_一篇文章学会文件上传
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Core中Emit的使用
  • .net 发送邮件