沿“委托”而上溯到“NET事件模型”-来自王涛《你必须知道的.NET》

委托链有一个特性: 就是所有加入的委托, 都会在激活时按照加入的次序被执行.

下面看用委托实现的NET事件模型

public class Calculator
{
    //定义计算器事件CalculateEventArgs
  public class CalculateEventArgs:EventArgs
  {
    //只读数据变量
    public readonly Int32 x, y;
    //构造函数-在这里输入数据变量
    public CalculateEventArgs(Int32 x,Int32 y)
    {
      this.x=x;
      this.y=y;
    }
  }

  //声明事件委托,名称为CalculateEventHandler
  //注意前面没有说,多播的委托多数需要返回值是void
  public delegate void CalculateEventHandler(object Sender, CalculateEventArgs e);

  //这是计算器类的事件字段,用于外部绑定
  public event CalculateEventHandler MyCalculate;

  //提供一个受保护的虚拟方法,子类可以覆盖它,以便·进行拒绝监视等操作
  protected virtual void OnCalculate(CalculateEventArgs e)//注意其参数的写法
  {
    if (MyCalculate!=null)
    {
      MyCalculate(this,e);//参数就是为了能正常调用委托类型变量的
    }
  }

  //进行计算-调用这个方法表示有新的计算发生了
  public void Calculate(Int32 x, Int32 y)
  {
    CalculateEventArgs e=new CalculateEventArgs(x,y);

    OnCalculate(e);//还记得委托链吗?能按次序通知所有事件的注册者
  }
}

//定义一个消息触发器-触发消息用的
public class CalculatorManager
{
  //消息通知方法1,定义跟Calculator.CalculateEventArgs一样
  public void Add(object Sender,Calculator.CalculateEventArgs e)
  {
    System.Windows.Forms.MessageBox.Show("加法结果:" + (e.x + e.y));
  }
  //消息通知方法2,定义跟Calculator.CalculateEventArgs一样
  public void Subtract(object Sender, Calculator.CalculateEventArgs e)
  {
    System.Windows.Forms.MessageBox.Show("减法结果:" + (e.x - e.y));
  }
}

...调用代码

private void button4_Click(object sender, EventArgs e)
{
  //定义计算器对象
  Calculator cal = new Calculator();
  //定义计算器事件触发器对象
  CalculatorManager cm = new CalculatorManager();

  //事件绑定
  cal.MyCalculate += cm.Add;//注意不能有括号
  cal.MyCalculate += cm.Subtract;

  //事件激活---------------------
  //先准备数据
  int x = Convert.ToInt32(textBox1.Text);
  int y = Convert.ToInt32(textBox2.Text);
  cal.Calculate(x,y);
  //-----------------------------
  //这其实也是用委托实现的观察者模式
  //cal.MyCalculate += cm.Add;-------->这里也就是在增加(或者叫注册)观察者
  //通过cal.Calculate(x,y);激活观察事件通知,由于委托链的特性,使得
  //在委托链之中的观察者(就是你绑定的事件cal.MyCalculate += cm.Subtract;)
  //都能得到通知
}


...
posted @ 2008-04-23 16:08  怒杀神  阅读(223)  评论(0编辑  收藏  举报