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