C#中的Delegates与Event Handler eventbus和handler

1. 使用Delegates进行事件处理,一般遵循下面的模式:

我们将事件的发起者(Event Source)称为Publisher,将事件的处理者(Event Handler)称为Subscriber.



2. 具体的做法,用一个简单的例子来看如何进行事件的封装处理!

鲨鱼正在网上潜水,突然他决定出门(Event),他会有什么动作呢(Event Handler)?

---> 决定出门了....(一个外部调用...sharkMind.DecideGetOut())

---> 鲨鱼的脑子产生一些生物电... (一个事件激发了... OnGetOut)

---> 谁来做处理,丢给神经系统吧...(一个delegate要负责传递指令....GetOutEventHandler)

---> 具体如何做,当然是鲨鱼的身体啦...(sharkBody.OpenDoor())

---> 一个事件可能需要好几个动作处理哦,所以我需要:开门,放下东西,关门!

2.1 纵观一下整个事件的处理过程...

filename: Program.cs

class Program {

static void Main(string[] args) {

//鲨鱼的脑袋,算是一个事件发起者,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();

}

}

2.2 剖析整个组成...先从delegate开始,为了能够封装事件,我们需要先定义一个delegate:

delegate void GetOutEventHandler(Object source, GetOutEventArgs e);2.3 假定你的事件处理的时候,还需要传递一些参数,所以我们还需定义一个EventArgs,

就算出门的时候带什么东西吧~~~ ^ ^!

filename:GetOutEventArgs.cs

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;

}

}

}

2.4 对应出去,我们就局限下面的响应动作了:

filename:GetOutSubscribe.cs

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...");

}

}

2.5 事件是如何产生的

filename:GetOutPublisher.cs

class GetOutPublisher {

C#中的Delegates与Event Handler eventbus和handler
//Publisher 说:喂,我有一个事件,谁来处理?

public event GetOutEventHandler OnGetOutHandler;

//Publisher 产生具体的事件

protected void OnGetOut(GetOutEventArgs e) {

//有谁来负责处理事件吗?

if (null != this.OnGetOutHandler) {

//让他们来处理吧...

OnGetOutHandler(this, e);

}

}

//对外公开的接口,调用此方法会产生事件.

public void DecideGetOut() {

OnGetOut(new GetOutEventArgs());

}

}

  

爱华网本文地址 » http://www.aihuau.com/a/25101012/137388.html

更多阅读

模拟c++中的strstr函数 c语言中strstr函数

/************************************************************************//* 例子:请写出一个函数来模拟c++中的strstr函数:该函数的返回值是主传中字符子串的位置以后的所有字符,请不要使用任何c程序已有的函数函数名: strstr函

声明:《C#中的Delegates与Event Handler eventbus和handler》为网友好小伙分享!如侵犯到您的合法权益请联系我们删除