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