讲到回调函数这个概念给大家普及下
所谓回调函数
就是指这个函数先在某处注册
而它将在稍后某个需要的时候被调用
比如在利用SDK 进行Windows编程的时候
我们需要注册一个WNDCLASS类
这个类中有这样一个参数lpfnWndProc
要进行消息处理
我们就要用处理消息的函数的指针给它赋值
消息处理函数什么时候被调用的?我们没有显式地在程序中看到啊
是OS调用的
这是SDK的试验方式
当然用的是过程式的语言C
可以通过传递函数的指针实现
C++中怎么来实现呢?当然C++兼容C用函数指针就可以同时C++又提供了面向对象的机制可不可以有不同的实现机制呢?当然!STL 中的functor(Function object)就可以用到回调上比如对一个存放int数据的vector进行递减排序的话我们可以这样进行
sort(vecbegin()vecend()greater<int>())
greater<int>()
就是我们传递的一个匿名对象它重载了函数调用运算符()我们没有显式地调用这个对象里面提供的函数sort函数对对象里面的函数进行call backJava中要实现类似functor的功能应该怎么办呢?Command模式可以帮上忙Command模式看起来很简单只要把command封装到一个接口中就可以Command模式是回调机制的一个面向对象的替代品比如javaio 中已经定义好的一个接口
public interface FilenameFilter {
boolean accept(File dir String name)}
这个FilenameFilter就是Command实现Command的类就是ConcreteCommand这个接口所声明的操作accept 就是看看目录dir中的文件name是否满足某种要求如果满足就返回true否则就返回false这个要求是什么呢?你要对这个接口进行实现比如我想看看这个文件的名称包含不包含指定的字符串那么就可以定义下面的类
class DirFilter implements FilenameFilter {
private String afn;
public DirFilter(String afn){
thisafn = afn;
}
public boolean accept(File dir String name){
String f = new File(name)getName()
return findexOf(afn) != ;
}
}
怎么样使用它呢?File类中有这样一个方法
public String[] list(FilenameFilter filter)
因此我们就可以这样做了
File file = new File()
String[] list = filelist(new DirFilter(wf))
得到的list就是一个当然目录中所有包含字符串wf的文件名称的字符串数组怎么样看起来是不是和C++中的functor差不多呢?