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