原帖:http://www.mscto.com/C__Net/22643005.html
class Program
{
static void Main(string[] args)
{
Program.DelegateEvent();//调用示例
}
/// <summary>
/// 委托、事件
/// </summary>
private static void DelegateEvent()
{
//鲨鱼的脑袋,算是一个事件发起者,the Publisher.
GetOutPublisher sharkMind = new GetOutPublisher();
//鲨鱼的身体,算是一个事件处理者,the Subscriber.
GetOutSubscriber sharkBody = new GetOutSubscriber();
//建立鲨鱼的神经系统单元 软件开发网 www.mscto.com
GetOutEventHandler eventAction1 = new GetOutEventHandler(sharkBody.OpenTheDoor);
GetOutEventHandler eventAction2 = new GetOutEventHandler(sharkBody.PutDownWhat);
GetOutEventHandler eventAction3 = new GetOutEventHandler(sharkBody.CloseTheDoor);
//把鲨鱼的神经系统单元与脑子联系起来, 即为将事件处理动作注册到事件委托中.
sharkMind.OnGetOutHandler += eventAction1;
sharkMind.OnGetOutHandler += eventAction2;
sharkMind.OnGetOutHandler += eventAction3;
//外面天气不错,我决定出去走走,于是产生一系列的事件处理!
sharkMind.DecideGetOut();
}
}
/// <summary>
/// 事件数据类
/// </summary>
public class GetOutEventArgs : System.EventArgs
{
// 出门带啥东西呢?
private string _takeWhat;
public GetOutEventArgs()
{
this._takeWhat = "Nothing";
}
public GetOutEventArgs(string strTakeWhat)
{
if (strTakeWhat.Equals(""))
{
this._takeWhat = "Nothing";
}
else
{
this._takeWhat = strTakeWhat;
}
}
public string TakeWhat { get { return _takeWhat; } set { _takeWhat = value; } }
}
/// <summary>
/// 处理事件的方法
/// </summary>
class GetOutSubscriber
{
public void OpenTheDoor(Object source, GetOutEventArgs e)
{
// 开门...
Console.WriteLine("Open the door...");
}
public void PutDownWhat(Object source, GetOutEventArgs e)
{
// 放下手中的东西...
Console.WriteLine("Put down " + e.TakeWhat + "...");
}
public void CloseTheDoor(Object source, GetOutEventArgs e)
{ // 关门...
Console.WriteLine("Close the door...");
}
}
/// <summary>
/// 委托
/// </summary>
public delegate void GetOutEventHandler(Object source, GetOutEventArgs e);
/// <summary>
/// 事件触发类
/// </summary>
class GetOutPublisher
{
//Publisher 说:喂,我有一个事件,谁来处理?
public event GetOutEventHandler OnGetOutHandler;
//Publisher 产生具体的事件
protected void OnGetOut(GetOutEventArgs e)
{
//有谁来负责处理事件吗?
if (null != this.OnGetOutHandler)
{
//让他们来处理吧...
OnGetOutHandler(this, e);
}
}
//对外公开的接口,调用此方法会产生事件.
public void DecideGetOut()
{
OnGetOut(new GetOutEventArgs());
}
}