本文主要是自己对于回调的一些总结记录,如果有错误欢迎大家指正。
程序从调用方式上可以分为三类:同步调用、回调和异步调用(另开辟线程调用),本文主要讨论回调。
个人感觉,回调很像设计模式中的strategy策略模式,原因如下:
首先,定义一个回调接口:
public interface CallBack {
public void exec();
}
定义一个Client类实现该接口:
public class Client implements CallBack{
public void exec() {
System.out.println("Client execute...");
}
}
Server类持有Callback接口:
public class Server {
private CallBack callback;
public void setCallBack(CallBack callback){
this.callback=callback;
}
public void post(){
callback.exec();
}
}
使用方式:
CallBack callback=new Client();
server.setCallBack(callback);
//服务器端运行...
System.out.println("Server is running...");
System.out.println("Server running finish,call Client...");
server.post();//call
其中,CallBack接口类似于strategy中定义的如何调用算法的接口,Client类似于strategy中的算法实现类,Server类似于strategy中的策略使用类。
也就是说,上面这个回调例子其实就是只有一个算法的strategy模式的实现,不知道这么说是否合理。
另一种回调方式是通过匿名内部类:
//通过匿名内部类的回调
Server server=new Server();
server.setCallBack(new CallBack(){//注册客户端
public void exec(){
System.out.println("No Name Client execute......");
}
});
//服务器端运行...
System.out.println("Server is running...");
System.out.println("Server running finish,call Client...");
server.post();//call
其中,new CallBack(){...}即声明了一个实现CallBack接口的匿名内部类(以替代Client类实现),并且实现了exec方法。
在JDK类库中经常看到一些用于事件监听的Listener接口,大部分使用时都是这种匿名内部类方式(比如Swing和AWT类库中很多图形界面上的事件监听)。