- C、C++ 允许将函数指针作为参数传递;
- JavaScript、Python 允许将函数名作为参数传递。
在计算机程序设计中,回调函数,简称回调(Callback),是指通过函数参数传递到其他代码的,某一块可执行代码的引用。
在 main 函数中,我们异步发送一个请求,并且指定处理响应的回调函数,接着 main 函数去做其他事,而当响应到达后,执行回调函数。
当我们想要换一种“处理响应”的方法时,将必须去修改 CallBack 类的 processRequest()方法。而如果将 CallBack 类改为接口,我们就可以仅更换 CallBack 的实现了。
首先,写 CallBack 接口:
public interface CallBack {
public void processResponse();
}
实现类:
public class CallBackImpl implements CallBack {
@Override
public void processResponse() {
System.out.println("[CallBack]:处理响应");
}
}
main方法:
public class Main {
public static void main(String[] args) throws Exception {
Request request = new Request();
System.out.println("[Main]:我开个线程去异步发请求");
CallBack callBack = new CallBackImpl();
new Thread(() -> {
try {
request.send(callBack);
} catch (Exception e) {
e.printStackTrace();
}
}).start();
System.out.println("[Main]:请求发完了,我去干点别的");
Thread.sleep(100000);
}
}
例子:
1、首先定义一个回调接口,只有一个方法tellAnswer(int answer),即学生思考完毕告诉老师答案:
/**
* 回调接口
*/
public interface Callback {
public void tellAnswer(int answer);
}
2、定义一个老师对象,实现Callback接口:
/**
* 老师对象
*/
public class Teacher implements Callback {
private Student student;
public Teacher(Student student) {
this.student = student;
}
public void askQuestion() {
student.resolveQuestion(this);
}
@Override
public void tellAnswer(int answer) {
System.out.println("知道了,你的答案是" + answer);
}
}
老师对象有两个public方法:
(1)回调接口tellAnswer(int answer),即学生回答完毕问题之后,老师要做的事情
(2)问问题方法askQuestion(),即向学生问问题
3、接着定义一个学生接口,学生当然是解决问题,但是接收一个Callback参数,这样学生就知道解决完毕问题向谁报告:
/**
* 学生接口
*/
public interface Student {
public void resolveQuestion(Callback callback);
}
最后定义一个具体的学生叫Ricky:
public class Ricky implements Student {
@Override
public void resolveQuestion(Callback callback) {
// 模拟解决问题
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
// 回调,告诉老师作业写了多久
callback.tellAnswer(3);
}
}
测试
public class CallbackTest {
@Test
public void testCallback() {
Student student = new Ricky();
Teacher teacher = new Teacher(student);
teacher.askQuestion();
}
}