今天复习了一下C#中的Delegates与Event Handler
整理一下思路如下
使用Delegates进行事件处理一般遵循下面的模式
我们将事件的发起者(Event Source)称为Publisher将事件的处理者(Event Handler)称为Subscriber
具体的做法用一个简单的例子来看如何进行事件的封装处理!
鲨鱼正在网上潜水突然他决定出门(Event)他会有什么动作呢(Event Handler)?
> 决定出门了(一个外部调用sharkMindDecideGetOut())
> 鲨鱼的脑子产生一些生物电 (一个事件激发了 OnGetOut)
> 谁来做处理丢给神经系统吧(一个delegate要负责传递指令GetOutEventHandler)
> 具体如何做当然是鲨鱼的身体啦(sharkBodyOpenDoor())
> 一个事件可能需要好几个动作处理哦所以我需要开门放下东西关门!
纵观一下整个事件的处理过程
filename: Programcs
class Program {
static void Main(string[] args) {
//鲨鱼的脑袋算是一个事件发起者the Publisher
GetOutPublisher sharkMind = new GetOutPublisher();
//鲨鱼的身体算是一个事件处理者the Subscriber
GetOutSubscriber sharkBody = new GetOutSubscriber();
//建立鲨鱼的神经系统单元
GetOutEventHandler eventAction = new GetOutEventHandler(sharkBodyOpenTheDoor);
GetOutEventHandler eventAction = new GetOutEventHandler(sharkBodyPutDownWhat);
GetOutEventHandler eventAction = new GetOutEventHandler(sharkBodyCloseTheDoor);
//把鲨鱼的神经系统单元与脑子联系起来 即为将事件处理动作注册到事件委托中
sharkMindOnGetOutHandler += eventAction;
sharkMindOnGetOutHandler += eventAction;
sharkMindOnGetOutHandler += eventAction;
//外面天气不错我决定出去走走于是产生一系列的事件处理!
sharkMindDecideGetOut();
}
}
剖析整个组成先从delegate开始为了能够封装事件我们需要先定义一个delegate
delegate void GetOutEventHandler(Object source GetOutEventArgs e);
假定你的事件处理的时候
还需要传递一些参数
所以我们还需定义一个EventArgs
就算出门的时候带什么东西吧~~~ ^ ^!
filenameGetOutEventArgscs
class GetOutEventArgs : SystemEventArgs {
// 出门带啥东西呢?
private string _takeWhat;
public GetOutEventArgs() {
this_takeWhat = Nothing;
}
public GetOutEventArgs(string strTakeWhat) {
if (strTakeWhatEquals()) {
this_takeWhat = Nothing;
} else {
this_takeWhat = strTakeWhat;
}
}
public string TakeWhat {
get {
return _takeWhat;
}
set {
_takeWhat = value;
}
}
}
对应出去我们就局限下面的响应动作了
filenameGetOutSubscribecs
class GetOutSubscriber {
public void OpenTheDoor(Object source GetOutEventArgs e) {
// 开门
ConsoleWriteLine(Open the door);
}
public void PutDownWhat(Object source GetOutEventArgs e) {
// 放下手中的东西
ConsoleWriteLine(Put down + eTakeWhat + );
}
public void CloseTheDoor(Object source GetOutEventArgs e) {
// 关门
ConsoleWriteLine(Close the door);
}
}
事件是如何产生的
filenameGetOutPublishercs
class GetOutPublisher {
//Publisher 说喂我有一个事件谁来处理?
public event GetOutEventHandler OnGetOutHandler;
//Publisher 产生具体的事件
protected void OnGetOut(GetOutEventArgs e) {
//有谁来负责处理事件吗?
if (null != thisOnGetOutHandler) {
//让他们来处理吧
OnGetOutHandler(this e);
}
}
//对外公开的接口调用此方法会产生事件
public void DecideGetOut() {
OnGetOut(new GetOutEventArgs());
}
}
当有了上面的Publisher与Subscriber后要把它们串起来需要遵循下面的过程
Step 建立Publisher Instance即Event Source
Step 建立Subscriber Instance即Event Handler
Step 建立一个Delegate来承接Subscriber的具体动作
Step 把建立的Delegate与Event进行绑定我们称之为register
Step 外部调用产生Event所有的Event Handler收到通知开始执行
具体可以参考中的主函数的步骤!
运行的结果如下:
Open the door
Put down Nothing
Close the door