- 什么是回调
- 回调核心思想
- 案例代码实现
- 后序
一、什么是回调
回调是一种双向调用模式,什么意思呢,就是说,被调用方在被调用时也会调用对方,这就叫回调。“If you call me, i will call back”。
eg:
public interface CallBack {
// 定义一个报告 反馈的方法
public void baoGao(int num);
}
Boss implements callback{
Worker a=new worker();
//派a去干活,并且把自己传进去
a.gojob(this);
@Override
public void baoGao(int num) {
System.out.println("员工反馈工作信息");
}
}
Worker extends Employee {
@Override
public void wanChengRenWu(CallBack callBack) {
// 回调操作,反馈给领导情况
//这个callBack其实也就是老板.深刻体现了,只要你调用我,我就会反过来调用你
//所以为什么发起调用的一方要实现一个接口(或者也相当于抽象类吧),就是为了便于接收方反过来调用发起方的函数.
callBack.baoGao(666);
}
}
也就是类A,实现了call接口,你也可以把它叫call类
call类 调用 B类的方法,B类内部 会调用call类的方法
这就叫你调用我,我调用你.
至于为什么是回调,B类一定会调用call类的某个方法
如果有D类也想和B完成回调,即调用B的时候,被B调用,只需要实现call接口,并且重写方法就行
当然。这只是一个例子,不要就是只死板认为这才是回调。
但是回调一定会有一个标志
就是被调用类里会有一个方法
fun(接口call a){
a.func()
}
这个就是典型的回调标志了,在方法里再反过来调用参数的方法。
举个例子 B类里 静态方法 就是上面这个
然后在A类里使用 B类的fun方法
也未必就是A类去实现接口call
静态方法可以直接用类名调用
B.fun(new call {实现接口方法})
这也是一种回掉呀,只不过参数a其实是一个匿名类
new 了这个接口,实现了函数的匿名类
(接口照理来说是不能new的,不过看到了一种说法,这种匿名内部类写法可以理解为实现了接口,但是没有类名的类,所以其实还是一种类)
Java语言中经常会使用到回调机制,或许只是平时没有注意到吧。比如Android开发中的OnClickListener,当按键触发的时候会执行用户实现的回调方法,从而完成对按键的反馈。
开发过程当中存在某种特殊的业务需求,例如:
描述:
- 老板给员工下达了工作任务之后,就去做其他事情了。(此时此 刻,老板不知道需要多长时间完成,不
会一直等着,而是做自己其他事情) - 员工接收到任务之后,按照要求完成任务
- 当员工任务完成的时候,主动的回馈给老板工作情况。
- 当员工回馈工作情况的时候,此时此刻老板还在做另外的事情
二、回调的核心思想
核心思想图解:
描述:
- Boss类 下达任务的方法 调用 Employee类的 完成任务方法
- 当Employee类的 完成任务方法执行完毕之后,会主动的调用 老板 Boss类的 callBack() 方法
三、案例代码实现 - 回调的接口 CallBack
/**
* 定义回调的接口,只需要定义一个报告反馈的方法即可
*/
public interface CallBack {
// 定义一个报告 反馈的方法
public void baoGao(int num);
}
- 老板类 Boss
/***
* 定义一个老板Boss类,需要去实现回调的接口 CallBack
*/
public class Boss implements CallBack {
// 定义下达任务的方法.需要在下达任务的当中调用 员工 完成任务的方法
public void xiaDaRenWu(Employee e) {
// 当下达任务的时候给出提示.等待着某位员工去完成任务
System.out.println("Boss下达任务了,等待员工去完成...");
// 员工去完成任务
// 由于Boss实现了接口,可以将Boss的对象 this作为参数传递
e.wanChengRenWu(this);
}
// 在报告的方法当中.需要去调用 员工信息
@Override
public void baoGao(int num) {
System.out.println("员工报告回馈信息: " + num);
}
}
- 员工抽象类 Employee
/**
- 员工类:由于不知道每个员工的完成方式,将员工定义为抽象
*/
public abstract class Employee {
// 员工当中完成任务的操作
public abstract void wanChengRenWu(CallBack callBack);
}
- 具体员工类 KoBe
/**
* 定义具体的员工类KoBe.完成员工任务的操作
*/
public class KoBe extends Employee {
@Override
public void wanChengRenWu(CallBack callBack) {
// 模拟完成工作的情况。需要消耗一定的时间
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 回调操作,反馈给领导情况
callBack.baoGao(666);
}
}
- 测试类 Test
/***
* 定义测试类完成 测试.创建老板Boss的对象以及 员工对象
*/
public class Test {
public static void main(String[] args) {
// 老板的对象
Boss b = new Boss();
// 具体员工的对象
KoBe k = new KoBe();
// 老板下达任务
b.xiaDaRenWu(k);
}
}
最终运行效果(“员工报告反馈信息”等4秒后 才会出现)
Boss下达任务了,等待员工去完成…
员工报告回馈信息: 666
四、 后序
这个例子是一个典型的体现接口作用的例子,有些朋友可能不太明白接口的好处.
当各位朋友不太明白接口好处的朋友可以重点看一下这个例子,多多理解。
总结起来,回调的核心就是 回调方将本身即this传递给调用方.这样调用方就可以在调用完毕之后告诉回调方它想要知道的信息。
命名:由于A调用B的函数,所以A是调用方,B是被调用方,由于A被回调,也是A实现回调函数,所以也叫A为回调方
A 是回调方(调用方),A将自己this 传递给被调用方B,被调用方B在调用完毕后告诉A 所需信息。
类A的a()方法调用了类B的b()方法
类B的b方法执行完毕主动调用类A的callback()方法
回调函数callback()是一个函数,它是一个由回调方(调用方)A自己实现,供被调用方B使用的特殊函数。
在面向对象的语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象称为回调对象。