先上代码:
/**
* 下层类(被调用者,例如一些已封装好的类)。
* @author hhj
*
*/
public class Callee {
//关联了一个回调函数接口
private ICallback iCallback;
/**
* 提供给外界注入回调函数接口的具体实现
* 注册回调函数
* 这里提供的是设置注入,构造注入也行
* @param iCallback
*/
public void setCallback(ICallback iCallback) {
this.iCallback = iCallback;
System.out.println("----调用者已经注册回调函数----");
}
/**
* 第一种方式,需先执行setCallback(ICallback iCallback)方法注册回调函数
*/
public void executeCallerWant() {
//调用回调函数
this.iCallback.callbackMethod();
}
/**
* 这是第二种方式,直接依赖依赖回调函数接口,执行回调函数
* @param iCallback
*/
public void executeCallerWant(ICallback iCallback) {
iCallback.callbackMethod();
}
}
/**
* 上层(调用者,例如我们字节编写的应用),main方法里表示调用下层
*
* @author hhj
*
*/
public class Caller {
public static void main(String[] args) {
Callee callee = new Callee();
//第一种形式
//向下层注册回调函数接口的具体实现
callee.setCallback(new ICallback() {
@Override
public void callbackMethod() {
System.out.println("我就是回调函数1");
}
});
//调用下层的一些方法
callee.executeCallerWant();
System.out.println("------------------------------");
//第二种形式
callee.executeCallerWant(new ICallback() {
@Override
public void callbackMethod() {
System.out.println("我就是回调函数2");
}
});
}
}
/**
* 回调函数接口
* @author hhj
*
*/
public interface ICallback {
/**
* 回调函数(上层想让下层执行的代码都写在这个方法里)
*/
void callbackMethod();
}
设计一些类(被调用者)给别人使用的时候,但却不知道调用者到底想怎样执行,于是就将调用者想实现的行为的封装抽象成一个接口,且该类关联或者依赖这样一个抽象接口。调用者只需具体实现该接口,并将该接口注入或传入给被调用者callee,被调用者适时调用回调函数即可。 这样做的好处就是灵活性好,
被调用者:“你想让我执行你(调用者)自己的方法?行,你只要符合我的规范,实现我提供的接口,并告诉我(注册----构造注入、设置注入或者直接作为参数传入),后面想让我执行的时候,自然就知道你要执行什么了”。
回调函数就是由调用者 事先 告诉被调用者,被调用者在合适的时间调用的一个方法。
张三李四打电话帮忙解题的例子也一样,只不过被调用者在调用回调函数前后先做一些其他的事(李四这里是解题),之后再调用回调函数,不过这里有点异步回调的感觉,就是李四解好题之后,再用回调函数通知张三,不需要张三等他。