Zhang Jiuan’ Notes

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.

返回顶部