对算法工作台recadmin来说,callback很重要
模块间调用方式:
同步调用、异步调用、回调
回调的思想:
-
类A的a()方法调用类B的b()方法
-
类B的b()方法执行完毕主动调用类A的callback()方法
这样一种调用方式组成了上图,也就是一种双向的调用方式,使用过程中调用方式可以是方法、http、https、rpc等
栗子: 有两个模块,模块1让模块2去做一个任务,任务完成后告诉模块1,模块1知道结果再做相应操作。实际生活中,比如:老师(模块1)问问题,学生(模块2)回答问题,并且告诉老师回答完成
代码示例:
首先定义一个回调接口IStudent,只有一个方法tellAnswer(int answer)即:学生回答完毕告诉老师答案
@FunctionalInterface
public interface Istudent{
public void tellAnswer(int answer);
}
定义一个学生类Student
public class Student implements Istudent{
public void call() {
new Server(this).tellAnswer();//传递this
}
@Override
public void tellAnswer(int i) {
System.out.println(i+"0%");
}
}
服务类(老师类)
public class Server{//导演
private List listeners = new ArrayList();//电话簿
/**
* 监听器注册
* 需要回答问题的学生进行注册
*/
public void register(IStudent listener) {
listeners.add(listener);
}
public void askProblem(){//某种状态发生改变
for(IStudent x: listeners) {
x.tellAnswer(12345);
}
}
测试一下
class TestCallback{
@Test
public static void test() {
Server s =new Server();
//注册3个需要回答问题的学生
Istudent student1=(i)->{System.out.println("+" + i + "0%");};
s.register(student1);
s.register((i)->{System.out.println("++" + i + "0%");});
s.register(new Istudent(){
@Override public void tellAnswer(int i){
System.out.println("==" + i + "0%");
}
});
//问问题
s.askProblem();
}