/** *Java回调函数 * A 接口主要目的 定义回调函数(C) 传入回调函数(C)到接口B * B 处理自己的业务逻辑 合适的时候 调用回调函数(C)传递给A * 其他情况: 定义回调函数可以传入这个回调函数实例化对象与回调函数 (其实就是接口或者接口实例对象) * (忽略) 如果A 实现回调函数接口 在回调函数接口方法实现类赋值(处理自己的业务逻辑)就行了 * * 如果函数接口 自己实现的(匿名内部类,独自实现) 在A接口定义函数接口 方法中操作 */
// 定义服务接口A
public class ServiceA implements ServiceA {
public void doSomething(ServiceB serviceB) {
//第一种 定义回调函数
Callback callback = new Callback() {
@Override
public void onResult(String result) {
// 处理结果
System.out.println("Result: " + result);
}
};
// 调用服务B,并将回调函数传递给服务B
serviceB.doSomethingAsync(callback);
}
//第二种 定义回调函数
//public class ServiceA implements ServiceA,Callback {//自己实现callback
// public void doSomething(ServiceB serviceB) {
// 调用服务B,定义回调函数,并传入服务B
//serviceB.doSomethingAsync(this);
//}
}
// 定义服务接口B
public class ServiceBImpl implements ServiceB {
public void doSomethingAsync(Callback callback) {
// 异步执行操作,并在合适的时机调用回调函数
// 将B结果传递给回调函数
String result = "Some result";
//调用回调函数
callback.onResult(result);
}
}
// 定义回调接口
public interface Callback {
void onResult(String result);
}
总结起来:
- 调用方:定义回调函数并将其传递给被调用方。
- 被调用方:在适当的时机调用回调函数,将结果传递给调用方
优点:
- 解耦性:回调函数可以将调用方和被调用方解耦,使它们可以独立开发和维护,减少模块之间的依赖性。
- 灵活性:回调函数提供了一种灵活的处理方式,调用方可以根据需要定义不同的回调函数实现,满足不同的业务需求。
- 异步处理:回调函数适用于处理异步操作的结果,可以在耗时操作完成后通知调用方,避免阻塞线程或等待操作完成。
- 扩展性:通过定义回调函数的接口或抽象类,可以方便地扩展和替换不同的回调函数实现,增加系统的灵活性和可扩展性。
缺点:
- 复杂性:使用回调函数可能增加代码的复杂性,特别是在处理多层嵌套回调时,容易导致代码难以理解和维护。
- 难以调试:回调函数的执行流程比较复杂,当出现问题时,调试和定位错误可能会比较困难。
- 可读性差:回调函数可能导致代码的执行顺序变得难以预测和理解,对于阅读代码的其他开发人员来说,可能会增加理解的难度。