先看看java中的回调函数,java中很多模式及其类似,有访问者,观察者等模式。ioc等也有这个类似的原理。
Java代码
公开课测试{
/**
* @参数参数
*/
公共静态无效主(字符串[] args){
// TODO 自动生成的方法存根
新的测试()。doExecute(新的回调(){
公共无效执行(){
System.out.println("正在执行....");
}
});
}
私人无效 doExecute(回调回调){
System.out.println("回调前......");
回调.execute();
System.out.println("回调后......");
}
}
公共类测试 {
/**
* @参数参数
*/
公共静态无效主(字符串[] args){
// TODO 自动生成的方法存根
new Test().doExecute(new CallBack(){
公共 voidexecute() {
System.out.println("正在执行....");
}
});
}
private void doExecute(CallBack callBack) {
System.out.println("回调前......");
回调.execute();
System.out.println("回调后......");
}
} 输出结果为:
Java代码
回调前......
正在执行....
回调后……
回调前……
正在执行....
回调后.....这里充分的体现了不是我来调用你,而是你来调用我。
这里的我就是“doExecute”,你就是“execute”
回调可以用在哪些地方呢?
1,比如著名的ioc的事务处理就是这样的,每个方法的事务处理都是一样的,都是一些开始一个事务,用try包住,等等,所以就可以不管它们,变的只要执行方法的不同,比如存储,删除,查询什么的。
2,可以减少写类,一个接口,可以有很多的实现类,在回调里面,就匿名了。著名的jive里面的DatabaseObjectFactory就是这个办法。
Java代码
接口DatabaseObjectFactory {
/**
* 返回与 id 关联的对象,如果
* 无法加载对象。
*
* @param id 要加载的对象的 id。
* @return id指定的对象,如果不能则返回null
* 被加载。
*/
公共对象loadObject(长ID);
}
接口DatabaseObjectFactory {
/**
* 返回与 id 关联的对象,如果
* 无法加载对象。
*
* @param id 要加载的对象的 id。
* @return id指定的对象,如果不能则返回null
* 被加载。
*/
公共对象loadObject(长ID);
}
外部调用的根据id不同产生任何你想要的对象。
在看看javascript里面的:
JS代码
函数测试()
{
var self=这个;
this.func1=函数()
{
self.test2(function (){alert('正在执行');})
}
}
测试.prototype.test2=函数(func)
{
Alert("回调前做一些事情");
如果(函数)
函数();
Alert("回调后做一些事情");
}
函数测试()
{
var self=这个;
this.func1=函数()
{
self.test2(function (){alert('正在执行');})
}
}
Test.prototype.test2=函数(func)
{
Alert("回调前做一些事情");
如果(函数)
函数();
Alert("回调后做一些事情");
}
然后,在html里面:
Html代码
<html>
<头>
<脚本类型=文本/javascript src="1.js">
</脚本>
<脚本>
新的测试().func1();
</脚本>
</头>
<正文>
</正文>
</html>
<html>
<头>
<脚本类型=文本/javascript src="1.js">
</脚本>
<脚本>
新的测试().func1();
</脚本>
</头>
<正文>
</正文>
</html>
java和javascript的回调都差不多。
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。