一、概述
回调机制在java中非常常见,android开发的同学可能非常熟悉,因为增加各种监听都是利用回调机制,而web开发的同学其实也经常用到,在hibernate和spring框架里面非常常见。
二、理解回调的关键
个人认为理解回调的第一个关键是了解它的应用场景,其实回调机制就是普通的使用接口进行普通调用的过程,没有任何特别的地方,但是为什么它如此难以理解呢,是因为你用到了它见到了它但是却没有注意到为什么使用它。第二个关键是了解它的运作方式
理解应用场景
1 使用框架
框架比如hibernate的开发者显然是不知道你要实现什么具体的业务逻辑,你的代码完全由你控制,而hibernate还是需要在你的代码中间执行各种操作,帮你完成一些重复性的工作,很多时候这种工作是分布在代码中间的,断断续续并不连贯。并不是你执行完了再执行hibernate,而是你一句它一句的执行,这时候,接口就有用了,hibernate开发者定义了接口,然后让你来实现接口,hibernate开发者在开发的时候只面向接口编程,等你把实现传递进来的时候自然就会调用这些实现了。
/**
*模拟Spring hibernateTemplate内部程序
*/
interface CallBack{
public void doCRUD();
}
public class HibernateTemplate {
public void execute(CallBack action){
getConnection();
action.doCRUD(); //执行接口方法
releaseConnection();
}
public void getConnection(){
System.out.println("获得连接...");
}
public void releaseConnection(){
System.out.println("释放连接...");
}
}
/**
*使用hibernateTemplate程序
*/
public class MyService{
private HibernateTemplate template = new HibernateTemplate();
public void add(){
template.execute(new CallBack(){ //这里就是回调函数
public void doCRUD(){
System.out.println("执行add操作...");
}
});
}
public void delete(){
template.execute(new CallBack(){
public void doCRUD(){
System.out.println("执行delete操作...");
}
});
}
}
2 监听程序
监听是什么,是系统对一个动作是否发生产生的一个监控,比如手机触屏,这个动作是我们对手机发出的,或者说是我们对手机操作系统发出的,它能够监控到这个动作,但是对于这个动作做什么响应它只能把这个动作告知一个运行中的应用程序,这个应用程序之所以能够获取到这个触屏信息是因为使用了触屏监听。
换句话说就是操作系统有人开发,应用程序也有人开发,但是它们之间又是密切联系的,怎么办呢,利用接口,或者说利用回调
运作方式
理解了应用场景之后,我们会发现,其实有两个方面的运作:
1、被调用方:被调用方面向接口编程,不关心具体实现代码只是单纯的调用接口方法来填补那些被调用方不知道或者不关心的代码。
2、调用方:调用者实现接口,传递一个接口引用给被调用方,此时那些不知道如何实现的代码被调用方实现了。
重点内容:调用和被调用者是用什么区分的。这一点就要看应用场景了,我们发现一个共同点,就是协作,我们无法单独实现所有的代码,利用了其他人写的方法、对象等(比如hibernate框架),那么这时候大家都不想控制对方、改写对方的代码,所有使用回调,这时候就有了调用者和被调用者的区分。