C#筆記:事件和觀察者模式
- 2019 年 11 月 22 日
- 筆記
利用C#的默認EventHander 和委託,可以很方便的寫出觀察者模式的事件。 所謂觀察者模式,舉例說明。有一個水壺,一個報警器(不是安裝在水壺上的)。需求是:水燒到100度的時候,報警器報警。 解決方案一: 在報警器上設置一個探測器,每隔兩秒鐘檢查一下水有沒有100度。如果100度到了,就啟動報警器。 解決方案二: 在水壺上裝一個發信器,到了100度的時候就發一條簡訊給報警器,報警器報警。 第一個方案,是很讓人煩躁的。我們就來看看第二個方案。也就是所謂的觀察者模式。 利用C#,只要五個步驟就能實現。
/// <summary> /// 第一步,創建事件資訊類,這個是事件的傳入參數 /// </summary> public class TextEventArgs : EventArgs { private string strText; public string StrText { get { return strText; } // set { strText = value; } } public TextEventArgs(string inStrText) { this.strText = inStrText; } }
這個類中保存了需要傳入事件的資訊。
/// <summary> /// 第二步 創建系統的EventHander 參數是剛創建的EventArgs類 用來做事件的處理。實質是一個LIST,保存了很多 /// EventArgs為傳入值的實體(以函數表現)。調用它的時候,List中所有的函數都會被傳入EventArgs並執行。 /// 這就達到了觀察者模式的感覺 /// </summary> public event EventHandler<TextEventArgs> SettingTextEvent; /// <summary> /// 第三步 引發事件的過程,其實就是把EventArgs傳入事件。這個沒有也可以。 /// </summary> /// <param name="e"></param> public void OnSettingTextEvent(TextEventArgs e) { if (SettingTextEvent != null) { SettingTextEvent(this, e); } }
定義好事件和事件的調用方法,我們接下來就是綁定事件了。
/// <summary> /// 第四步,寫一個函數,用來綁定到事件中去,傳入值是EventArgs /// 並且執行相關的操作。其實,其它類的所以函數無論是否公有,都能想辦法綁定到事件上 /// </summary> /// <param name="sender">發送者</param> /// <param name="e">參數</param> private void Alert(object sender, TextEventArgs e) { MessageBox.Show(e.StrText); }
注意這個被綁定的函數的傳入值。
/// <summary> /// 第五步 綁定事件到Event中。然後觸發事件。被綁定的所有函數都會執行。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { //綁定到事件 this.SettingTextEvent += Alert; //new 出TextEventArgs 對它賦值 TextEventArgs tea = new TextEventArgs(this.textBox1.Text); //傳入TextEventArgs,調用事件 OnSettingTextEvent(tea); this.Close(); }
當 OnSettingTextEvent 執行的時候,綁定到SettingTextEvent中所有的函數都會執行。 完畢。當然,被綁定的不一定是本類中的函數,也可能是外部類的其它方法。至於具體怎麼綁定,那就看大夥的了。