觀念 C# — EventHandler

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; }
        }
    }

範例程式下載:文字版遊戲,實作觀察者模式

(本文如有錯誤或觀念不正確,請不吝指教。如有侵權內容也煩請反應,謝謝~)

1 關於 “觀念 C# — EventHandler” 的評論

發表留言