http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html
1、委托:方法名作为其他方法的参数(增强程序扩展性)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EventTest
{
//定义委托,它定义了可以代表的方法的类型
public delegate void GreetingDelegate(string name);
class Program
{
private static void EnglishGreeting(string name)
{
Console.WriteLine("Morning, " + name);
}
private static void ChineseGreeting(string name)
{
Console.WriteLine("早上好, " + name);
}
//注意此方法,它接受一个GreetingDelegate类型的方法作为参数
private static void GreetPeople(string name, GreetingDelegate MakeGreeting)
{
MakeGreeting(name);
}
static void Main(string[] args)
{
GreetingDelegate greetingDelegate;
greetingDelegate = EnglishGreeting; // 先给委托类型的变量赋值
greetingDelegate += ChineseGreeting; // 给此委托变量再绑定一个方法
// 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
GreetPeople("Jimmy Zhang", greetingDelegate);
Console.ReadKey();
}
}
}
2、事件:为了让程序更好的面向对象(有更好的封装性),在利用委托delegate的基础上,来对类进行封装。从委托到事件是一个平滑的过程,程序逐渐有更好的封装性。
过渡阶段的利用事件封装类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EventTest
{
//定义委托,它定义了可以代表的方法的类型
public delegate void GreetingDelegate(string name);
//新建的GreetingManager类
public class GreetingManager{
//在GreetingManager类的内部声明greetingDelegate变量
public event GreetingDelegate greetingDelegate;
public void GreetPeople(string name)
{
if (greetingDelegate != null)
{ //如果有方法注册委托变量
greetingDelegate(name); //通过委托调用方法
}
}
}
class Program
{
private static void EnglishGreeting(string name)
{
Console.WriteLine("Morning, " + name);
}
private static void ChineseGreeting(string name)
{
Console.WriteLine("早上好, " + name);
}
static void Main(string[] args)
{
GreetingManager gm = new GreetingManager();
gm.greetingDelegate += EnglishGreeting;
gm.greetingDelegate += ChineseGreeting;
gm.GreetPeople("Jimmy Zhang");
Console.ReadKey();
}
}
}
3、Observer 设计模式(订阅者 和 发布者)将上面程序中的 event 单独拿出来:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EventTest
{
class Mom
{
//定义一个委托
public delegate void delegateRun(string eatWhat);
//定义一个事件
public event delegateRun Eat;
//引发事件的方法
public void Cook(string eatWhat)
{
Eat(eatWhat);//被引发的事件
}
}
class Son
{
//定义事件处理方法
public void Eat(string eatWhat)
{
Console.WriteLine("儿子开始吃" + eatWhat);
}
}
class Father
{
//定义事件处理方法
public void Eat(string eatWhat)
{
Console.WriteLine("爸爸开始吃" + eatWhat);
}
}
class Program
{
static void Main(string[] args)
{
Son son = new Son();//实例化事件订阅者儿子
Father father = new Father();//实例化事件订阅者爸爸
Mom mom = new Mom();//实例化事件发布者妈妈
//订阅事件
mom.Eat += son.Eat;
mom.Eat += father.Eat;
//引发事件
mom.Cook("面");
Console.ReadKey();
}
}
}
4、.Net Framework 中的委托与事件,实际上就是把上面的 Observer 例子进行格式规范的代码整理.
标准参数格式 :public delegate void delegateRun(Object sender, EatSomeEventArgs e);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EventTest
{
public class Mom
{
public string week = "星期五";
//定义一个委托
public delegate void delegateRun(Object sender, EatSomeEventArgs e);
//定义一个事件
public event delegateRun Eat;
public class EatSomeEventArgs : EventArgs
{
public readonly string eatWhat;
public EatSomeEventArgs(string eatWhat)
{
this.eatWhat = eatWhat;
}
}
//引发事件的方法
public void Cook(string eatWhat)
{
EatSomeEventArgs e = new EatSomeEventArgs(eatWhat);
if (Eat != null)
{ // 如果有对象注册
Eat(this, e); // 调用所有注册对象的方法
}
}
}
public class Son
{
//定义事件处理方法
public void Eat(Object sender, Mom.EatSomeEventArgs e)
{
Mom mom = (Mom)sender;
Console.WriteLine("今天是" + mom.week + ", 儿子开始吃" + e.eatWhat);
}
}
public class Father
{
//定义事件处理方法
public void Eat(Object sender, Mom.EatSomeEventArgs e)
{
Mom mom = (Mom)sender;
Console.WriteLine("今天是" + mom.week + ", 爸爸开始吃" + e.eatWhat);
}
}
class Program
{
static void Main(string[] args)
{
Son son = new Son();//实例化事件订阅者儿子
Father father = new Father();//实例化事件订阅者爸爸
Mom mom = new Mom();//实例化事件发布者妈妈
//订阅事件
mom.Eat += son.Eat;
mom.Eat += father.Eat;
//引发事件
mom.Cook("面");
Console.ReadKey();
}
}
}