Java基础学习:functor的实现

Java基础学习:functor的实现,第1张

Java基础学习:functor的实现,第2张

经常听到回调函数的概念。所谓回调函数,就是这个函数一开始注册在某个地方,以后需要的时候再调用。比如用SDK编程Windows的时候,我们需要注册一个WNDCLASS类,里面有这样一个参数lpfnWndProc。为了处理消息,我们必须用处理消息的函数的指针给它赋值。消息处理程序是什么时候被调用的?我们在程序中没有明确看到。由操作系统调用。这是SDK的实验方式,当然是用过程化语言C,通过传递函数的指针就可以实现。

在C++中如何实现?当然C++是兼容C的,用函数指针就行了。同时,C++提供了面向对象的机制。可以有不同的实现机制吗?当然啦!STL中的函子(函数对象)可以在回调中使用。例如,如果我们对一个存储int数据的向量进行降序排序,我们可以这样做。

sort(vec.begin(),vec.end(),greater());

Greater()是我们传递的匿名对象,它重载了函数调用操作符“()”。我们没有显式调用这个对象中提供的函数,排序函数回调对象中的函数。

用Java实现类函子函数应该怎么做?命令模式会有所帮助。命令模式看起来非常简单,只需将命令封装到一个接口中。命令模式是回调机制的面向对象的替代方案。

例如,java.io中定义了一个接口

公共接口filename filter {
boolean accept(文件目录,字符串名称);
}

FilenameFilter是命令,实现命令的类是ConcreteCommand。这个接口声明的操作“accept”是看目录dir中的文件名是否满足一定的要求,如果满足就返回true,否则返回false。这是什么要求?你必须实现这个接口。例如,如果我希望看到这个文件的名称包含一个不包含指定
的字符串,那么可以定义下面的类:

DirFilter类实现FilenameFilter {
私有字符串afn
public dir filter(String afn){

this.afn = afn
}
public boolean accept(File dir,String name){
String f =新文件(name)。getName();
return f.indexOf(afn)!= -1;
}
}

怎么用?file类中有这样一个方法
public string [] list(文件名过滤filter)。

因此,我们可以这样做:
File file = new File(" . ");
String[]list = file . list(new dir filter(" wf "));

获得的列表是包含字符串“wf”的目录中所有文件名的字符串数组。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » Java基础学习:functor的实现

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情