一、引言
C#是个面向组件的程序,允许编写事件(Event),以便让对象以非同步的方式通知其他对象。实际上事件(Event)就是一个回呼(callback)的函数指针(Function Pointer),在C#中是通过delegate达成的。
二、描述
1、原始方式(订阅者模式)
比如:有一个人,有吃饭的方法,在吃完饭后他可以sleep/shopping。此时,您让他sleep,当他吃完饭后就sleep;您让他shopping,当他吃完饭后就shopping。代码如下
public delegate void EatCallBack //定义吃完饭要做什么模板(可带参数)
public class Human {
public event EatCallBack eatCallBack //定义模板指针变量
public Human(){} //构造器
public virtual void Eat(){ //定义吃饭的虚方法
eatCallBack(); //相当于回调了
}
}
public class Test {
public void shopping(){}; //定义shopping方法
public void sleep(){}; //定义sleep方法
public static int Main() {
Human human = new Human(); //定义一个人
//把sleep方法给了human中的模板指针(相当于注册/订阅)
human.eatCallBack += new EatCallBack(sleep);
human.Eat();//人开始吃饭,完了就开始sleep
}
}
2、改进成注册
public delegate void EatCallBack //定义吃完饭要做什么模板(可带参数)
public class Human {
public event EatCallBack eatCallBack = null; //定义模板指针变量
public Human(){} //构造器
public void AddEat(EatCallBack handler){ //添加注册方法
if(this.eatCallBack == null){
this.eatCallBack = handler;
}else{
this.eatCallBack += handler;
}
}
public void RemoveEat(EatCallBack handler){ //删除注册方法
this.eatCallBace -= handler;
}
public virtual void Eat(){ //定义吃饭的虚方法
eatCallBack(); //相当于回调了
}
}
public class Test {
public void shopping(){}; //定义shopping方法
public void sleep(){}; //定义sleep方法
public static int Main() {
Human human = new Human(); //定义一个人
//把sleep方法给了human中的模板指针(相当于注册/订阅)
human.AddEat(new EatCallBack(sleep));
human.Eat();//人开始吃饭,完了就开始sleep
}
}
3、传递事件参数(object sender,EatEventArgs e)
由于要有EatEventArgs,所以要封装此类。sender为事件持有者。
public delegate void EatCallBack(object sender,EatEventArgs e) //定义吃完饭要做什么模板
public class Human {
public event EatCallBack eatCallBack = null; //定义模板指针变量
public Human(){} //构造器
public Human(string name,string sex){ //构造器
_name = name;
_sex = sex;
}
public void AddEat(EatCallBack handler){ //添加注册方法
if(this.eatCallBack == null){
this.eatCallBack = handler;
}else{
this.eatCallBack += handler;
}
}
public void RemoveEat(EatCallBack handler){ //删除注册方法
this.eatCallBace -= handler;
}
public virtual void Eat(){ //定义吃饭的虚方法
if(this.eatCallBack == null){ //没有注册
return;
}
eatCallBack(this,new EatEventArgs(_name,_sex)); //相当于回调了
}
private string _name = "superMan";
private string _sex = "man";
}
public class EatEventArgs:EventArgs { //事件类
public EatEventArgs(string name,string sex){
//里面可以放一些信息
}
//放此Get方法
}
public class Test {
public void shopping(object sender,EatEventArgs e){ //定义shopping方法
Console.WriteLine(e.name +":"+ e.sex + "shopping");
};
public void sleep(object sender,EatEventArgs e){ //定义sleep方法
Console.WriteLine(e.name +":"+ e.sex + "sleep");
};
public static int Main() {
Human human = new Human(); //定义一个人
//把sleep方法给了human中的模板指针(相当于注册/订阅)
human.AddEat(new EatCallBack(sleep));
human.Eat();//人开始吃饭,完了就开始sleep
}
}
----------------------------------------------------------------------------------------