Java代码的回调函数经常由框架或是系统定义,由程序开发人员填充。
它的最主要特点是即定义了调用的规范同时又非常的灵活。
回调函数有些类似于观察者模式,它们的区别在于:观察者模式返回的参数为Event对象,而回调函数则一般直接返回数据本身。
回调函数包含:调用者:如dbutils中的QueryRunner。
回调规范,即一个接口,如dbutils中的ResultSetHandler<T>。其中可以定义N多个它的子类。
返回的数据:由用户自己定义,或是系统已经定义。
package cn.itcast.test;
/**
* 回调函数的简单写法
* @author 王健
* @version 2012-1-11
*/
public class TT {
public static void main(String[] args) {
One a = new One();
a.abc("Hello",new A(){ //这是没有返回值的回调函数
public void abc(String ss) {
System.err.println("SSS:"+ss);
}
});
}
}
class One{ //定义一个调用类
public void abc(String sql,A a){
a.abc(sql);
}
}
interface A{ //定义规范
public void abc(String ss);
}
package cn.itcast.test;
/**
* 返回指定的泛型的回调函数
* @author 王健
* @version 2012-1-11
*/
public class CallBack {
public static void main(String[] args) {
B b = new B();
String str = b.getO(new IB<String>(){
public String getObject(){
return "ddd";
}
});
System.err.println(str);
}
}
class B{ //声明一个类,此方法返回一个普通的值
public <T> T getO(IB<T> b){//声明方法同时接收一个回调函数,注意泛型的使用
return b.getObject();
}
}
interface IB<T>{ //将泛型定义到类上,直接在类上声明泛型,这样在声明时就可以设置泛型了
public T getObject();
}
package cn.itcast.test;
import java.util.ArrayList;
import java.util.List;
/**
* 返回list<T>类型的回调函数
* @author 王健
* @version 2012-1-11
*/
public class CallBack2 {
public static void main(String[] args) {
C c = new C(); //以下是测试代码
List<String> list = c.getObjs(new IC<String>(){
public String getObject(int row) {
return "Hello"+row;
}
});
System.err.println(">:"+list);
}
}
class C{ //定义被调用的类
public <T> List<T> getObjs(IC<T> ic){ //在类上定义泛型多处使用
List<T> list = new ArrayList<T>(); //里面声明一个List并多次调用回调函数的方法
for(int i=0;i<10;i++){
T t = ic.getObject(i); //多次调用回调函数的方法
list.add(t); //将从回调函数中返回对象放到List中
}
return list;
}
}
interface IC<T>{ //定义回调规范
public T getObject(int row);
}