回调函数—Java实现
1 回调函数的概念
- 同步调用
- 一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用
- 异步调用
- 一种类似于消息或者时间的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方。
- 回调
- 一种双向调用模式,被调用方在接口被调用时也会调用对方的接口
2 回调函数的demo
手机购买商品正常下单付款后,会反馈给用户一个扣款成功的提醒
2.1 同步回调
//自定义Callback接口
package demo;
public interface Callback {
public void process(String msg);
}
//实现Callback接口的实现类
package demo;
public class MyCallback implements Callback{
@Override
public void process(String msg) {
System.out.println("回调:" + msg);
}
}
//客户端
package demo;
public class User {
private String name;
private App app;
public User(String name, App app){
this.name = name;
this.app = app;
}
public void buy(String thing){
System.out.println("用户端:购买" + thing);
app.order(new MyCallback(), thing); //被调用方的接口
System.out.println("用户端:物品购买中,请耐心等待");
}
}
//服务端
package demo;
public class App {
public void order(Callback callback, String thing){
//模拟工作
System.out.println();
try {
System.out.println("服务端:" + thing + "下单中......");
Thread.sleep(5000); //模型下单处理
} catch (InterruptedException e) {
e.printStackTrace();
}
//回调操作,反馈信息
System.out.println();
callback.process("扣款成功");
}
}
//测试
package demo;
public class Test {
public static void main(String[] args) {
App app = new App();
User mx = new User("mx", app);
mx.buy("可乐");
}
}
//执行结果
用户端:购买可乐
服务端:可乐下单中......
回调:扣款成功
用户端:物品购买中,请耐心等待
其实这里可以发现,由于程序是同步运行的,所以用户端:物品购买中,请耐心等待该执行逻辑放在了最后,但实际上是不符合常理的。在用户确认购买后就应该执行,而不是扣完钱还要让用户等待。现采用异步回调修改上述User的代码。
2.2 异步回调
package demo;
public class User {
private String name;
private App app;
public User(String name, App app){
this.name = name;
this.app = app;
}
public void buy(String thing){
System.out.println("用户端:购买" + thing);
new Thread(new Runnable() {
@Override
public void run() {
app.order(new MyCallback(), thing);
}
}).start();
System.out.println("用户端:物品购买中,请耐心等待");
}
}
//执行结果
用户端:购买可乐
用户端:物品购买中,请耐心等待
服务端:可乐下单中......
回调:扣款成功