Java回调机制浅析

其实对于回调机制,在实际使用中还是经常用到的。但好笑的是,一直没能对所谓的回调的概念有一个很清晰的理解。

最近抽空看一些书的时候,老是时不时的提到回调的概念。那好吧,正好抽空来简单总结总结,加深一下印象和理解~


网上的百科之类的资料中,看到的对于回调比较书面和规范的解释是:

在计算机程序设计中,回调函数,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。


不知道别人对于这样比较“官方的”概念是一种怎么样的感受,反正我是“一头包”~

于是又在网上看了一些别人的文章,发现很久以前就有别人作了一个很形象的比喻:

某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等。

于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。

过了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("呵呵,拜拜了您!");
		}
	}
}

2、因为员工最后的决定(makeDecision)是根据调薪结果做出的。而同时调薪结果是由BOSS给出的。

所以我们想要拿到这个结果,需要提供一个“渠道”让BOSS给我们一个“说法”,^_^~这个渠道就是我们定义的规范 - 接口。

/**
 * 回调接口
 * 
 * @author hql 2015/03/03
 */
public interface SalaryListener {

	/*
	 * 实际这就是你向BOSS提供的回复你调薪询问的一种途径
	 *  BOSS根据该途径给你一个结果,而你就可以通过该结果来做出决定
	 */
	public int getNewSalary();
}

3、BOSS根据你的工作表现,来决定你的调薪结果。并且,值得注意的是:

BOSS最终给出的结果,当然要根据你提供的“渠道”返回给你,这样你才能准确的收到结果,并根据结果正确的做出决定(程序正确运行)。

/**
 * 老板类
 * 
 * @author hql 2015/03/03
 */
public class Boss implements SalaryListener {

	/*
	 * Boss收到了你询问薪资调整情况的问题, 根据你的问题(你提供的接口)来针对你进行回复
	 */
	@Override
	public int getNewSalary() {
		return 10000;
	}

}

4、接下来就是真正的“谈判”了(测试类)
/**
 * 回调函数测试类
 * 
 * @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 员工的时候。也就是所谓的回调!


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。