回调函数的理解:
场景:经理出差前安排员工去做某件事,而经理不可能一直等着员工做完这件事再出差,所以,经理告诉员工:当你做完这件事之后,打电话告知我一下。事情完成了之后的打电话的操作就可以理解为执行回调函数,告知经理事情完成了。
在程序中就是:A类调用B类中的X方法,然后B类在X方法中调用A类的Y方法,形成了回调
package com.zc.cloud.callbackdemo;
import com.zc.cloud.test.Emp;
/**
* @author zc
*/
public class Test {
public static void main(String[] args) {
Manager m = new Manager(new Employee(),"买车");
}
}
/**
* @author zc
* 员工类
*/
class Employee {
public void doThings(Manager manager, String thing){
System.out.println("经理让你去: " + thing);
manager.callback(thing);
}
}
/**
* @author zc
* 经理类
*/
class Manager {
public Manager(Employee emp, String thing){
emp.doThings(this,thing);
}
/**
* 回调函数
* @param thing 员工要买的东西
* 买完之后,告知经理事情已经做完了,这就是回调
*/
public void callback(String thing){
System.out.println("报告经理," + thing + ":已经做完了");
}
}
当员工的上级不止有经理,还有主管、老板之类的呢,我们不可能每增加一个新的类,就增加员工的构造参数,让他能满足各种不一样的执行结果,这样是最低效的方式。因此我们可以利用多态的方式,将回调函数抽取成一个接口,所有新增加的类都实现这个接口,该类也就具备了对员工类发出指令的功能以及执行回调操作的能力。具体方法如下:
package com.zc.cloud.callbackdemo;
import com.zc.cloud.test.Emp;
/**
* @author zc
*/
public class Test {
public static void main(String[] args) {
new Manager(new Employee(),"买车");
new Boss(new Employee(),"上班");
}
}
/**
* @author zc
* 员工类
*/
class Employee {
/**
* 利用多态实现不同对象对员工发起指令
* @param callback 对员工发起指令的对象
* @param thing 员工要做的事情
*/
public void doThings(Callback callback, String thing){
System.out.println(callback.getClass().getSimpleName() + "让你去" + thing);
callback.getBack(thing);
}
}
/**
* @author zc
* 经理类
*/
class Manager implements Callback<Manager>{
public Manager(Employee emp, String thing){
emp.doThings(this,thing);
}
/**
* 回调函数
* @param thing 员工要买的东西
* 员工买完之后,告知经理事情已经做完了,这就是回调
*/
@Override
public void getBack(String thing) {
System.out.println("报告经理," + thing + "已经完成了");
}
}
/**
* 老板类
*/
class Boss implements Callback<Boss>{
public Boss(Employee emp,String thing){
emp.doThings(this,thing);
}
@Override
public void getBack(String thing) {
System.out.println("报告老板," + thing + "已经完成了");
}
}
/**
* 回调接口
* @param <T>
*/
interface Callback<T>{
/**回调函数
* @param thing 要做的事情
* */
void getBack(String thing);
}