时间:2021-05-20
文章来源:csdn 作者:wangfengsdu
经常听到回调函数(callback function)这个概念, 所谓回调函数,就是指这个函数先在某处注册,而它将在稍后某个需要的时候被调用。比如在利用SDK 进行Windows编程的时候,我们需要注册一个WNDCLASS类,这个类中有这样一个参数 lpfnWndProc, 要进行消息处理,我们就要用处理消息的函数的指针给它赋值。消息处理函数什么时候被调用的?我们没有显式地在程序中看到啊。是OS调用的。 这是SDK的试验方式,当然用的是过程式的语言C,可以通过传递函数的指针实现。
C++中怎么来实现呢?当然,C++兼容C,用函数指针就可以。 同时C++又提供了面向对象的机制,可不可以有不同的实现机制呢? 当然! STL 中的functor(Function object)就可以用到回调上。 比如对一个存放int数据的vector进行递减排序的话,我们可以这样进行。
sort(vec.begin(),vec.end(),greater<int>());
greater<int>()
就是我们传递的一个匿名对象,它重载了函数调用运算符“()”。我们没有显式地调用这个对象里面提供的函数,sort函数对对象里面的函数进行call back。
Java中要实现类似functor的功能,应该怎么办呢?Command模式可以帮上忙。Command模式看起来很简单,只要把command封装到一个接口中就可以。Command模式是回调机制的一个面向对象的替代品。
比如 java.io 中已经定义好的一个接口
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){
this.afn = afn;
}
public boolean accept(File dir, String name){
String f = new File(name).getName();
return f.indexOf(afn) != -1;
}
}
怎么样使用它呢?File类中有这样一个方法
public String[] list(FilenameFilter filter)
因此,我们就可以这样做了:
File file = new File(".");
String[] list = file.list(new DirFilter("wf"));
得到的list就是一个当然目录中所有包含字符串"wf"的文件名称的字符串数组。怎么样,看起来是不是和C++中的functor差不多呢?
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java实现可安装的exe程序实例详解通过编写Java代码,实现可安装的exe文件的一般思路:1、在eclipse中创建java项目,然后编写Java代码,将编
Java5在java.util.concurrent包中已经包含了读写锁。尽管如此,我们还是应该了解其实现背后的原理。读/写锁的Java实现(Read/Writ
java实现微信服务器下载图片到自己服务器此功能的实现需要注意java中IO流的操作及网路开发,实现代码:/***@authorwhy**/publicclas
在java开发中我们会经常的使用到外部资源,而外资源一般是通过接口的方式提供出来,那在java中我们怎么使用HttpClient实现post请求接口实现实现We
一、区别Java中启动线程有两种方法,继承Thread类和实现Runnable接口,由于Java无法实现多重继承,所以一般通过实现Runnable接口来创建线程