其实对于回调机制,在实际使用中还是经常用到的。但好笑的是,一直没能对所谓的回调的概念有一个很清晰的理解。
最近抽空看一些书的时候,老是时不时的提到回调的概念。那好吧,正好抽空来简单总结总结,加深一下印象和理解~
网上的百科之类的资料中,看到的对于回调比较书面和规范的解释是:
在计算机程序设计中,回调函数,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。
不知道别人对于这样比较“官方的”概念是一种怎么样的感受,反正我是“一头包”~
于是又在网上看了一些别人的文章,发现很久以前就有别人作了一个很形象的比喻:
某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等。
于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。
过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。
这个例子说明了“异步+回调”的编程模式。
其中,你后来打手机告诉我结果便是一个“回调”过程;
我的手机号码必须在之前就告诉你,这便是注册回调函数;
我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
此时,对于回调就应该有一个大致的了解了。那么,最近恰逢年初,又是一年跳槽的高峰期了。
正好对于员工离职与跳槽的现象,其实也可以帮助我们对“回调”进行理解。
跳槽的很常见的原因自然就是薪资问题,那么:
假设我们作为一个员工,又是新的一年了,工资依旧可怜巴巴,心里捉急啊。
这时怎么办呢?跳吧?那万一刚跳,薪资又要调整了呢?
于是,决定了,先和BOSS“谈判”,根据结果再做最后的决定。
这个时候,实际上也就是所谓的一种回调。
我们以一个程序猿的角度来分解这个问题:
1、作为员工,我们想要根据与BOSS对于薪资调整问题的谈论结果,做出最后的决定
/** * 员工类 * * @author hql 2015/03/03 */ public class Employee { SalaryListener listener; void setSalaryListener(SalaryListener listener) { this.listener = listener; } void makeDecision() { int salary = listener.getNewSalary(); if (salary >= 10000) { System.out.println("调薪满意,继续奋斗!"); } else { System.out.println("呵呵,拜拜了您!"); } } }
所以我们想要拿到这个结果,需要提供一个“渠道”让BOSS给我们一个“说法”,^_^~这个渠道就是我们定义的规范 - 接口。
/** * 回调接口 * * @author hql 2015/03/03 */ public interface SalaryListener { /* * 实际这就是你向BOSS提供的回复你调薪询问的一种途径 * BOSS根据该途径给你一个结果,而你就可以通过该结果来做出决定 */ public int getNewSalary(); }
BOSS最终给出的结果,当然要根据你提供的“渠道”返回给你,这样你才能准确的收到结果,并根据结果正确的做出决定(程序正确运行)。
/** * 老板类 * * @author hql 2015/03/03 */ public class Boss implements SalaryListener { /* * Boss收到了你询问薪资调整情况的问题, 根据你的问题(你提供的接口)来针对你进行回复 */ @Override public int getNewSalary() { return 10000; } }
/** * 回调函数测试类 * * @author hql 2015/03/03 */ public class TestCallBackFunc { public static void main(String[] args) { //苦逼的员工 Employee me = new Employee(); //BOSS针对该苦逼员工给出的调薪结果 Boss boss = new Boss(); //苦逼的员工获取到了结果 me.setSalaryListener(boss); //回调,做出决定 me.makeDecision(); } }
在这里,首先作为员工,需要得到关于薪资调整的一个结果,而这个结果需要BOSS来决定。
所以首先,员工先向BOSS提出了这个问题,希望得到他的处理结果,这个过程是:员工 call BOSS
而BOSS收到了员工的提出的问题,并做出了处理,此时他要将处理结果告诉员工,这里的过程就是:BOSS call 员工。
所以当该问题得到一个完整的处理时,就是当BOSS得到员工的call,再call back to 员工的时候。也就是所谓的回调!
原文地址:http://blog.csdn.net/ghost_programmer/article/details/44039465