当前位置>>知识集锦

 

对于面向对象的编程语言,委托(Delegate,有时译作代理)与事件(Event)是其重要的组成部分,这也是语言学习者水平高低的分水岭,能否跨过这道门槛直接影响了语言的高级应用。现以世界末日为背景,用一个通俗的比喻来解释委托与事件,以帮助那些在门前徘徊的人们,希望能在末日来临前理解这两个概念。

 

我们假定要设计这样一个程序:有十个单身美女(分别假定为pretty_girl_01,pretty_girl_02…)随着世界末日的临近,会不断降低自己的择偶标准(假定标准由高到低分为五级,分别为standard_05,standard_04…,最初所有美女的择偶标准均为standard_05)。有一个帅哥(假定为pretty_boy)符合standard_03,也就是说如果美女不降低标准,他不可能追上十个美女中任何一个。按照程序设计,帅哥需要去追那些标准降低到他符合要求的美女。程序的难点在于,美女的标准降低完全取决于美女的意思,她有可能降,有可能不降,而且时间是不确定的。下面分别说说设计这样的程序的两种思路。

 

第一种思路是帅哥每隔一段时间(如一天一问)向十个美女求证一下她们的择偶标准,一旦某个美女告诉他标准降低到了standard_03或者更低,他便要主动出击,追那个美女。那么大概过程是这样子的:

 

第一次挨个(术语称为“遍历”)问美女们:美女,你要找个啥样的男生啊?

 

pretty_girl_01:老娘才不会降低标准呢(standard_05)!

 

pretty_girl_02:不好意思哦,我的标准还没有变,要找一个十全十美的男人(standard_05)。

 

pretty_girl_03:嗯,我现在只想找一个符合standard_04的男人了。

 

 

第一次询问完,没有美女的标准降低到了standard_03,那么隔一天需要进行第二次询问,如此往复。

 

直到第N次帅哥问:“美女,你要找个啥样的男生啊?”

 

pretty_girl_01:这世界没有好男人,老娘不打算找了(standard_05)!

 

pretty_girl_02: 就算是时间末日,我的目标依然是找一个十全十美的男人(standard_05)。

 

pretty_girl_03: 已经standard_04啦,不能再降了。

 

 

pretty_girl_07: 随便一个男生就好了(standard_02)。

 

问到这个美女(pretty_girl_07),pretty_boy就必须开始行动了,其追美女的过程就生效了。

 

至此,程序结束。

 

我们很容易看出,这种思路的弊端:(1)不管美女有没有降低标准,帅哥都要每天问一次,帅哥很累(在真正的计算机程序设定时,这种弊端体现在很耗计算机资源,要不断循环执行程序)(2)假如美女在帅哥刚问完之后降低了标准,而帅哥下次问要等到第二天,这样帅哥有可能错失先机,被其他男生抢了先。

 

那有没有更好的方法呢,我们来看第二种思路。假定美女都不会害羞,她们每降低一次标准都会主动通过中间人通知那个帅哥,帅哥在接受到中间人传递给他的信息后,通过与自己能够满足的标准对比,如果符合要求,则采取行动,不符合则不作为。

 

很显然,在这样的一个机制下,帅哥便省事多了(节省计算机资源),不会错过任何一个消息,不会有任何延迟(消息即时获取,不必一天一天的等)。这里我们便可以解释事件与委托的真正含义了。我们将美女调整自己的择偶标准定义为一个“事件”,帮美女传递信息的中间人定义为“委托”,而帅哥追美女的行为则为与“事件”绑定的“过程”。事件每发生(术语称触发)一次,委托便调用过程一次。

 

那么有的人会问,既然美女们都不会害羞,为什么还要中间人来帮忙,自己去跟帅哥说不就可以了?是的,如果能直接说,那当然很好,但条件不允许。我们再次假定,那个帅哥住在XX大多的学生公寓,按照学校规定,特别漂亮的姑娘是不允许进入公寓的。也就是说,姑娘是不能直接通知帅哥,她们只能先把自己调整标准的信息告诉宿舍管理员(委托),由管理员来通知帅哥(在面向对象的语言中,私有成员在外面是无法访问的,只能通过委托,事实上有些语言直接规定事件必须由委托来协助传递消息)。

 

还会有人要问,这都信息时代了,不一定非得面对面说吧,短信,邮件都可以啊?这话有道理,谁想要发邮件的话,俺知道pretty_boy的邮箱地址。


 





评论