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

news/2024/6/19 7:07:53

今天复习了一下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
        

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
        

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...






http://www.niftyadmin.cn/n/3653058.html

相关文章

网关,默认网关,自动网关,路由,网关与路由器的关系

本文内容整理自网络。包含的概念有:网关,默认网关,自动网关,路由,网关与路由器的关系。------网关网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B, 网络A的IP地址范围为“192.168.1.1~192.…

从错误信息思考一个问题:.NET Framework 与 COM/COM+ 到底有多深入的关联呢?

今天针对2个程序文件,用csc压了一个multi-file Assembly,发现了一个问题:(1) SumNumber.cs,编译为 SumNumber.netmodulecsc /target:module /out:bin/Debug/SumNumber.netmodule SumNumber.cs(2) Program.cs,编译为 My…

集线器与网桥的理解

本文内容整理自网络。包含的概念有:集线器(hub), 网桥。 -----HUB 集线器(HUB)属于数据通信系统中的基础设备,它和双绞线等传输介质一样,是一种不需任何软件支持或只需很少管理软件管理的硬件…

linux网桥

hzhsan: 本文中的linux网桥,是将多台真实的linux主机中的一台配制成网桥。和linux kvm虚拟机桥接上网方式的配制的网桥有所区别。(原理一样,只是一个是真实linux主机,另一个包含有虚拟主机)。 linux网桥 linux网桥是一…

发现CSDN给我开了一个专栏!

参考这里:http://blog.csdn.net/group/csdner/

Linux内核网桥的实现分析

Linux内核网桥的实现分析 Linux 内核分别在2.2 和 2.4内核中实现了网桥。但是2.2 内核和 2.4内核的实现有很大的区别,2.4中的实现几乎是全部重写了所有的实现代码。本文以2.4.0内核版本为例进行分析。 在分析具体的实现之前,先描述几个概念,有…

如何修复:Windows上面的WScript的脚本(.vbs)不能执行了?

错误描述:当执行用VBScript写的WScript脚本时,出现了下面的错误: There is no script engine for file extension ".vbs". 或是 找不到 .vbs 的执行引擎修复方法: 找到%WINDIR%/INF/WSH.inf&#xff0…

KVM虚拟机网络配置 Bridge方式,NAT方式

摘要:KVM虚拟机网络配置的两种方式:NAT方式和Bridge方式。Bridge方式的配置原理和步骤。Bridge方式适用于服务器主机的虚拟化。NAT方式适用于桌面主机的虚拟化。 nat 的网络结构图: bridge 的网络结构见图: Bridge方式 问题…