Burnett

淡定,执着......
posts - 29, comments - 109, trackbacks - 22, articles - 10
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

dotNet学习笔记-浅谈.Net的事件代理

Posted on 2006-03-17 11:42 Burnett 阅读(...) 评论(...) 编辑 收藏
前言:这是一篇以前我在csdn上面写的一篇文章(http://blog.csdn.net/closetome),是寒假我第一次深入接触.net代理机制的一段学习笔记.如有不对的地方,还请大家不吝指教..

  .Net下的事件驱动机制是建立在委托(Delegate)模型下面的,从字面上来解释Delegate的意思就是代理某一样事务,就像现实生活中的买卖一样,各个商场会从生产商那里取得货物的经销代理权,从而商场只负责商品的加工而不必劳神市场。在.Net里的代理机制也是这样,我只要将一个函数逻辑的使用权交给另外一个逻辑,我就可以将我的精力放在其他的事情上面了,这里的逻辑意思就是代码结构。
  不过这个时候要注意程序的主导权是在响应事件的函数那里还是在发布事件的函数那里.在多线程的编程中这种主导权的问题会演变成一种和主线程争夺权限的问题(结果很明显,胳膊扭不过大腿,主线程还是拥有对象的所有权,解决的办法是建立一个后台工作者线程BackgroundWorker,再调用一个回调函数,让主线程响应这个回调就可以了.代码放在学校了,改天拷上来.)
  这在Win32时代就是回调函数(CallBack),学过C++的程序员可能比较熟悉函数指针这种称呼。代理在Event中的应用基本上就是函数指针的作用。
其实我这几天一直在思考这种回调机制的运作方法,虽然头脑有点模糊,但是还有这么点意思,也许只有把它变成文字以后,我才能发现其中的对错。
声明使用一个代理其实非常容易:
public class WorldCup2006
{
    public delegate void WatchTheGameHandler(/*args list*/);//注意这里的args list就是所谓的代理签名,必须和要绑
定的函数的参数列表一致
    public event WatchTheGameHandler WatchTheGame;//这就声明了一个事件
    public void GotoGerman(){....};
    public void StayatHome(){....};
    public void WithTheTeamCoachAndMM(){....};
}
/*
注意以下两种方式,你可以选择其中之一,也可以两种都选,
//"+="是重载的操作运算符,你可以不必关心它,
当然你也可以写成WatchTheGame=WatchTheGame+new WatchTheGameHandler(GotoTheGerman);
*/
WatchTheGame+=new WatchTheGameHandler(GotoGerman);
WatchTheGame+=new WatchTheGameHandler(StayatHome);
WatchTheGame+=new WatchTheGameHandler(WithTheTeamCoachAndMM);

大致的模型应该是这样的:
  每一个类中会存在这么一组代理:比如有一个我定义的WorldCup2006这个类,其中有WatchTheGame,HaveATest...等等的响应事件的代理,这些代理的作用就是当它与相应的逻辑建立连接的时候(注意这里可以建立一对多的关系,也就是一个代理可以对应多个操作逻辑),在激发了某种消息(比如鼠标左键的按下行为)的时候,可以执行相应的逻辑(就象前面所说的,可能是一个逻辑,也可能是多个,主要在于向代理注册的逻辑有多少个)。其实我们不用代理也行,重载WorldCup2006然后自定义响应各种用户操作。所以使用代理的好处就在这里显现出来了,给出了一个对外自定义响应消息的一个接口。我可以把我想要的操作绑定到特定的消息上面。解释以上的代码就是:2006年德国世界杯就要开始啦(实例化一个类),你怎么观看这场比赛呢(产生一个消息)?是呆在家里看电视(将WatchTheGame绑定到StayatHome()逻辑上)还是去德国观看现场(将WatchTheGame绑定到GotoGerman()上),其实只要你有钱,还可以坐在教练席里和MM坐在一起看哦(将WatchTheGame绑定到WithTheTeamCoachAndMM())。 
其实接触到.net的内部还是这几天的事情,因为要写一个在windows下运行较多的程序,所以从java转变到了.net这里,发现.net和java的理念有一些差别,.net崇尚的是封装,把它的东西封装得严严实实得就等你调用就行,方便归方便,让你很难摸索到其中得运行机制,有时候做完程序都不知道怎么写出来的(不过要比Delphi好多了),但是java就不是这样,该暴露的地方就暴露出来,该隐藏的就隐藏,大方得体,让人写一遍程序就有一遍的收获,所以java强调的是框架,而.net强调的封装。

 小弟第一次写文章,打小语文没有学好,条理不是很清楚,有什么不对的地方,希望多交流交流