callback(回调)与hook(钩子)机制
许多接触了一些程序的朋友,可能对这两个词不再默生了,这些朋友可能大概知道callback是什么,也大概知道HOOK可以用来做些什么。但是如果向他们深究一些深层次的东西,却难以得到一个更清晰的答案了。对许多事物的理解我总是认为是这样的,越是了解其本质,答案也就越简单,当然认识也就越深刻,最终不会再拘泥于个别应用上的答案了。为了找到这个答案,让我们逐步进行探索。
callback起初可以形象地这么理解,一个BUTTON存在这里,我们可以add一个action,那么如果这个button被触发的时候会调用这个action。呵呵,这样似乎有点绕了,不过还不难理解。理在再分析一下机制。button像一个事件监听器,也是一个事件源;而action则是一个动作。下面以一些简单的代码加以表示。
class button
{
int width;
int height;
int color;
int style;
Action *paction; //动作列表
….
function event() { //事件触发
….
}
function addAction(Action) {
….
}
}
class Action {
functon actionPerform(Event e) {
….
}
}
到这里这个机制相对就比较明朗了。但是总觉得button描述还不够清晰,因为事件源和监听器还没有分开。button是一个事件源这没有什么异意,但它是监听器有些牵强了。于是下面的代码产生了。
class ActionListener {
Action *paction;//动作列表
functoin action(Event e) {
….
}
}
class button{
ActionListener *pactionlistener;
…..
}
这样无论逻辑上,还是层次上都更加清晰了。好了,通过这个小示例,我们基本上面以了解事件小模型了。对回调也有了感性的认识。
现在让我们做进一步的分晰,抛开button具体,分析其本质。实际做的只是这样一件事:事件源包含有一个或多个事件监听器,一个事件监听器又有一个多个事件(事件就是用户添加的了,想多少就多少:-)。当事件发生的时候,监听器会挨个调用它内部的每个事件。
实际上上述的这些东东就已经触及callback的本质了,但还不明了。那么怎么样可以用更形象的方式去说明这种机制呢?我们做如下试验:
A:我是一个手表修理工,您有什么要做的可以找我。
B:我的手表坏了,你帮我修一下吧,明来我来取。
这个情景够简单吧,事实上仔细理解的话,callback就是想使用计算机语言表达这样一种情景!这就是我不做,你帮我做的一种机制的结构化实现。
那么人们常说的HOOK呢?如果理解了callback机制,那么HOOK就不难理解了,它和callback本质上一点区别都没有!不要被这些复杂的名词搞混就够了。这些就象听惯了事件而忘却了函数调用一样,实际什么事件模型,统统还是函数调用一样。
thx
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!









No Comments, Comment or Ping
Reply to “callback(回调)与hook(钩子)机制”
You must be logged in to post a comment.