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中所有的函数都会执行。 完毕。当然,被绑定的不一定是本类中的函数,也可能是外部类的其它方法。至于具体怎么绑定,那就看大伙的了。