1) 什么是回调?(What)
精妙比喻:我把手机号码给你,你通过手机号码联系我。
具体解释:
我把我的手机号码给你,你通过电话号码打电话 联系我。
我把我的手机号码给你,你通过电话号码发短信 联系我。
共同的部分:
我把我的手机号码给你,你通过电话号码(****)联系我。
不同的部分
(****)每次在使用的时候,选择是打电话或是发短信。
2) 使用java如何实现回调?(How)
Java代码
/**
* 包含有回调方法的类
*/
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 : ~
3) 回调都做了什么?
将变动与不变的代码分离,变动的代码在每次使用时确认。
4) 什么情况使用回调?为什么要使用回调? (Why)
步骤固定,但有一部分内容只有在使用的时候才能知道。
5)不用回调,实现同样同能还有其他方式吗?(Why)
6)其他地方使用回调?
6.1 Spring框架中HibernateTemplate类中通过回调获取Session。HibernateTemplate部分源码:
/*
Spring框架HibernateTemplate类部分源码
*/
// HibernateTemplate.java,仅execute方法。伪码
public <T> T execute(HibernateCallback<T> action) throws DataAccessException {
return doExecute(action, false, false);
}
protected <T> T doExecute(HibernateCallback<T> action, boolean enforceNewSession, boolean enforceNativeSession)
throws DataAccessException {
// ...
// 这里使用'回调'
T result = action.doInHibernate(sessionToExpose);
// ...
}
// HibernateCallback.java 回调接口
public interface HibernateCallback<T> {
T doInHibernate(Session session) throws HibernateException, SQLException;
}
/*
使用HibernateTempalte的execute方法
*/
public static void main(String[] args){
// ...
hibernateTemplate.execute(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
// 直接使用session进行操作
session.createQuery(queryString);
}
});
// ...
}
注: java回调具体名字,有的说是java回调函数,java回调机制(不知道这种说法对不对),本文统一使用“java回调”。