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();
//建立鯊魚的神經系統單元
軟件開發網 www.mscto.com
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...
|