C# 的 EventHandler 是設計模式中的觀察者模式(Observer Pattern)的實作。(請參考:觀念 設計模式 — Observer Pattern)
已知觀察者模式[發佈者/訂閱者]中的發佈者要「註冊」和「通知」眾多訂閱者,每一訂閱者要提供一個統一的方法給發佈者,讓他來呼叫通知。
EventHandler 包辦了這些工作。以參考範例來說明:
有三個類別:Boss(老大)、Assistants(助理)、Fans(粉絲)。當Boss呼叫,Assistants和Fans都會被通知並回應。這些工作只需透過 EventHandler 就可完成。
首先 Boss 類別宣告一個 EventHandler,名為 BossEventHandler 給 Assistants和Fans 類別調用
Boss 類別
public class Boss { public event EventHandler BossEventHandler; }
接著,Assistants和Fans 類別調用 Boss類別的 EventHandler,向它註冊自定義的方法。
Fans 類別
public class Fans { public Fans(Boss boss) { //將 FansSayHello 註冊到 Boss 類別的 EventHandler boss.BossEventHandler += new EventHandler(this.FansSayHello); } private void FansSayHello(object sender, EventArgs e) { string Msg = (e as BossEventArgs).Message; Console.WriteLine(Msg); Console.WriteLine("I am a big fan."); } }
Assistants 類別
public class Assistants { public Assistants(Boss boss) { //將 AssistantsSayHello 註冊到 Boss 類別的 EventHandler boss.BossEventHandler += new EventHandler(this.AssistantsSayHello); } private void AssistantsSayHello(object sender, EventArgs e) { string Msg = (e as BossEventArgs).Message; Console.WriteLine(Msg); Console.WriteLine("I am an assistant."); } }
最後,在Boss 類別定義一個 Method 來通知與執行已經註冊在 EventHandler 的 Methods。
public class Boss { public event EventHandler BossEventHandler; public void OnEventCall(BossEventArgs e) { //通知執行所有已註冊在Boss類別的EventHandler的方法 BossEventHandler(this, e); } }
以下是完整範例:
internal class Program { private static void Main(string[] args) { Boss boss = new Boss(); BossEventArgs bossEventArgs = new BossEventArgs() { Message = "Boss called." }; Fans fan = new Fans(boss); Assistants assistant = new Assistants(boss); boss.OnEventCall(bossEventArgs); Console.ReadLine(); } public class Boss { //宣告EventHandler public event EventHandler BossEventHandler; public void OnEventCall(BossEventArgs e) { //通知所有已註冊在Boss類別的EventHandler的方法 BossEventHandler(this, e); } } public class Fans { public Fans(Boss boss) { //將FansSayHello註冊到Boss類別的EventHandler boss.BossEventHandler += new EventHandler(this.FansSayHello); } private void FansSayHello(object sender, EventArgs e) { string Msg = (e as BossEventArgs).Message; Console.WriteLine(Msg); Console.WriteLine("I am a big fan."); } } public class Assistants { public Assistants(Boss boss) { //將AssistantsSayHello註冊到Boss類別的EventHandler boss.BossEventHandler += new EventHandler(this.AssistantsSayHello); } private void AssistantsSayHello(object sender, EventArgs e) { string Msg = (e as BossEventArgs).Message; Console.WriteLine(Msg); Console.WriteLine("I am an assistant."); } } public class BossEventArgs : EventArgs { public string Message { get; set; } } }
■ 範例程式下載:文字版遊戲,實作觀察者模式
(本文如有錯誤或觀念不正確,請不吝指教。如有侵權內容也煩請反應,謝謝~)
BossEventHandler?.Invoke(this, e); would be a better choice
讚讚