Java回调函数

谈到回调函数,最通用的例子还是“打电话问问题”,我打电话 向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电 话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模 式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你 的呼叫,这是回调函数必须符合接口规范。

这个故事理解起来很容易,可真要你写时就可能会模糊。当然也可能是我看到的例子有点复杂,涉及到了线程和异步处理,代码复杂化了,反而把我给转晕了,具体代码不便公开,刚才花了近两个小时,从宏观角度看代码,把功能集中化,折叠起来,最后终于看明白了,也对回调函数有了进一步的理解。下面我把网上的一个经典解释回调函数的例子转载过来,与诸君分享一下。

/**
 * 包含有回调方法的类
 * 呼叫我
 */
public class  CallMe {
    public void call(CallBack callBack){ // 参数是CallBack接口类型
        System.out.print("我把我的手机号码给你,你通过电话号码");
        callBack.execute(); // 回调,不同部分(****),即打电话 OR 发短信
        System.out.print("联系我!");
     }
}

/**
 * 回调接口
 */
interface CallBack {
 void execute();
}
//上面的通常在一起,下面开始调用,即使用“回调”的类
/**
 *  使用回调的类
 *  “打电话”
 */
public class  CallUp {
    public static void main(String[] args) {
        CallMe callMe = new CallMe();
        callMe.call(new CallBack(){
            public void execute(){
                System.out.print("  打电话  ");
            }
        });
    }
}
/**  OutPut : ~
 * 我把我的手机号码给你,你通过电话号码  打电话  联系我!
 */

/**
 * 使用回调的类
 *  “发短信”
 */
public class  SendMessage {
    public static void main(String[] args) {
        CallMe callMe = new CallMe();
        // 创建一个实现CallBack的匿名内部类
        // 通过new表达式返回的引用自动向上转型为对CallBack的引用。
        CallBack callBack = new  CallBack(){
            public void execute(){
                System.out.print("  发短信  ");
            }
        };
        callMe.call(callBack);
    }
}
/**  OutPut : ~
 * 我把我的手机号码给你,你通过电话号码  发短信  联系我!
 */

 

posted on 2013-06-13 14:33  11133432211  阅读(57)  评论(0)    收藏  举报