应用场景:比如我写一个工具,下载任务,下载任务可能成功,可能失败。为了解耦,我的这个下载工具类只能专门用来下载,如何处理成功和失败,这个就交给调用方来完成。
回调接口
接口声明。
/**
* @描述: 结果回调
*/
public interface ResultCallback {
void success();
void failure(Exception e);
}
被调用方(下载任务)
接口定义,并使用。
/**
* @描述: 下载任务
*/
public class Download {
private ResultCallback callback;
public Download(ResultCallback callback) {
this.callback = callback;
}
public void excuteDownload(String usrl) {
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) new URL(usrl).openConnection();
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod("GET");
//do download things here ...
callback.success(); //thing's done callback
} catch (IOException e) {
callback.failure(e); // thing's error callback
}
}
});
}
}
调用方
接口实现。
public static void main(String args[]){
new Download(new ResultCallback() {
@Override
public void success() {
//do something when work is done
}
@Override
public void failure(Exception e) {
//do something when work is fail
}
}).excuteDownload("your parameter");
}
总结:接口回调,实际上是利用了java中的多态性,利用父亲引用指向子类的地址,从而实现父亲接口调用子类实现类的方法。接口回调是设计模式的解耦核心,可以说几乎所有的模式都用到了接口回调。