在软件模块间的相互调用中,主要有三种机制:同步调用,异步调用和回调
同步调用是调用方A call 被调用方B的接口,并等待B执行完给出一个回执后A继续执行,这期间A是阻塞的
一部调用是调用方A call 被调用方B的接口后,不等待B执行完,且B执行完后会直接回执A
回调是指调用A调用被调用方B的时候,B也回调被调用方,双方互相调用接口,只不过call动作是有A放出的
同步调用是最简单的,异步调用要在回调的基础上实现,因此掌握回调至关重要
我们来用一个程序来模拟回调情形:
package junit.callback;
/**
* 魔法类
* @author Administrator
*
*/
interface Magic{
public void doMagic();
}
/**
* 神仙类
* @author Administrator
*
*/
class Immortal{
private String name;
private Magic magic;
public Immortal(String name, Magic magic) {
super();
this.name = name;
this.magic = magic;
}
public Immortal(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Magic getMagic() {
return magic;
}
public void setMagic(Magic magic) {
this.magic = magic;
}
public void crossSea(Magic magic){
this.magic = magic;
System.out.println(name);
magic.doMagic();
System.out.println("过海。。。");
}
}
public class TestCallBack {
public static void main(String[] args) {
Immortal i1 = new Immortal("铁拐李");
i1.crossSea(new Magic() {
@Override
public void doMagic() {
System.out.println("将葫芦变成条葫芦大船");
}
});
}
}
运行结果如下:
铁拐李
将葫芦变成条葫芦大船
过海。。。
恰当地使用回调,有以下的作用:
避免重复代码
在你需要更多的通用功能的地方更好地实现抽象(可处理各种类型的对象和变量)。
增强代码的可维护性
增强代码的可读性
有更多定制的功能