事件模型(event model)
事件模型的5个组成部分
- 事件拥有者(event source)(类对象)(有些书将其称为事件发布者)
- 事件成员(event)(事件拥有者的成员)(事件成员就是事件本身,事件不会主动发生,其只会在事件拥有者的内部逻辑的触发下发生。)
- 事件响应者(event subscriber)(类对象)(有些书将其称为事件订阅者)
- 事件处理器(event handler)(事件的响应者的成员)(根据拿到的事件参数/信息对事件进行处理)
- 事件订阅(委托类型)
举个栗子:“裁判员开枪,运动员开始跑步。”
在上面这个例子中,事件拥有者是裁判员,事件成员是开枪,事件响应者是运动员,事件处理是开始跑步。
至于事件订阅,它不是具体的对象或成员,其作用是将事件和事件处理器关联到一起,其代表了事件拥有者与事件响应者之间的联系,比如裁判员开枪,他所在的比赛现场上的运动员会起跑,但几百里外的其他运动员不会起跑,在现场看比赛的观众也不会起跑,因为他们与裁判员之间没有联系,即没有订阅裁判员的事件。
除此之外,事件订阅还能够约束事件成员能够把什么样的事件参数传递给事件处理器、事件处理器应该拥有什么样的签名和返回值类型(方法的签名由方法名称和参数列表组成,不包括返回值类型)。我们不能随随便便地拿任何事件处理器来处理事件,就像当裁判员开枪时,运动员应该起跑而不是坐下来喝杯茶。
从发生到响应的5个动作
①事件拥有者拥有一个事件→②事件响应者订阅了这个事件→③事件拥有者触发了事件→④事件响应者会被依次通知到(按照订阅的顺序)→⑤事件响应者根据拿到的事件参数对事件进行处理
事件模型组成部分的3种组合方式
1、事件拥有者和事件响应者分别属于不同的类:
namespace TestConsole
{
class Program
{
static void Main(string[] args)
{
Form myForm = new Form(); //事件拥有者:myForm
Test myTest = new Test(myForm); //事件响应者:myTest
myForm.ShowDialog(); //显示窗体
}
}
class Test
{
private Form form;
public Test(Form form)
{
if (form != null)
{
this.form = form;
this.form.Click += FormClicked; //鼠标点击事件
//事件:Click;事件处理器:FormClicked;事件订阅:+=
}
}
//事件处理器:(可由编译器自动生成)
private void FormClicked(object sender, EventArgs e)
{
form.Text = DateTime.Now.ToString(); //将当前时间作为窗体的标题
}
}
}
//发生事件:鼠标点击窗体;
//谁拥有这个事件:窗体myForm,鼠标点击的是它;
//谁响应了这个事件:myTest,当窗体被点击时,其要做出处理;
//做出什么处理:为窗体添加当前时间。
2、事件拥有者和事件响应者是同一个对象
namespace TestConsole
{
class Program
{
static void Main(