关于FilenameFilter的accept的回调

THINK IN JAVA中代码:
[code="java"]
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class DirList{
public static void main(String args[]){
File path = new File("D:\NpagE");
String list[];
if(args.length==0){
list = path.list();
}else{
list = path.list(new DirFilter(args[0]));
}
for(int i=0;i<list.length;i++){
System.out.println(list[i]);
}
}

}

public class DirFilter implements FilenameFilter{
private Pattern pattern;
public DirFilter(String regex){
pattern = Pattern.compile(regex);
}
public boolean accept(File dir,String name){
return pattern.matcher(new File(name).getName()).matches();
}
}
[/code]
说accept是回调函数,不理解这个为什么是回调函数呢?明明是在list(FilenameFilter)中直接调用的。

回调函数不应该像是下面这个样子的吗
[code="java"]
public class A{

public void aaa(){

B b = new B();

b.action(this);

}

public void bbb(){}

}

public class B{

public void action(A a){

a.bbb();

}

}
[/code]
高手给解释下,这个FilenameFilter中accept()方法为什么是回调函数。
[b]问题补充:[/b]
那么回调函数是什么模式或者是哪几种模式?
还有如何理解FilenameFilter的accept为回调函数呢?
[b]问题补充:[/b]

上面的例子的调度模式是如下图所示吧:但是在下图并没看见“回调”啊
[img]http://dl.iteye.com/upload/attachment/143515/ed2db1a2-2e88-30ef-9da5-80683ecbed3f.jpg[/img]
[align=center]图一[/align]

[img]http://dl.iteye.com/upload/attachment/143523/8f90949e-66a0-37d5-9a7c-13410106c140.jpg[/img]
[align=center]图二[/align]

[b]问题补充:[/b]
To atian25
恩,是理解有问题。

[code="java"]public class A{

public void aaa(){

B b = new B();

b.action(this);

}

public void bbb(){}

}

public class B{

public void action(A a){

a.bbb();

}

}[/code]

这段代码中bbb()是回调函数吧?

另外:
“list = path.list(new DirFilter(args[0]));
把DirFilter的accept方法给了file.list来调用.这就是回调.
而不是说在accept方法里面调用外面的使用者 ”
您的这段话最后一句,不是我想的。我想的是accpet必须放在使用file.list中,例如:此例,accept必须放在调用了file.list的DirList中。

我可以这样理解你最后一句话么:
而不是在file.list中调用外面使用者的accept方法。

[b]问题补充:[/b]
难道java必须要通过接口传递function吗,下面这段代码中bbb()算不算回调函数呢?
[code="java"]public class A{

public void aaa(){

B b = new B();

b.action(this);

}

public void bbb(){}

}

public class B{

public void action(A a){

a.bbb();

}

} [/code]

算吧.
b.action 知道A肯定有个bbb方法. 然后再调用.

接口只是告诉别人我肯定有这个方法.

看下:
[url]http://www.iteye.com/problems/13729[/url]
[url]http://www.riabook.cn/doc/designpattern/TemplateMethod.htm[/url]
[url]http://www.iteye.com/topic/98461[/url]

那只是你对回调函数的理解只限于你上面的那种方式,

你的那种方式是设计模式的访问者模式而已

看下File.list的源码:

[code="java"]
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
ArrayList v = new ArrayList();
for (int i = 0; i < names.length; i++) {
// here
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return (String[]) (v.toArray(new String[v.size()]));
}
[/code]

我觉得是你对回调函数的理解有问题.

[quote]简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。[/quote]

list = path.list(new DirFilter(args[0]));
把DirFilter的accept方法给了file.list来调用.这就是回调.
而不是说在accept方法里面调用外面的使用者

[url]http://hi.baidu.com/spidermanzy/blog/item/b25b00956469c6097bf48016.html[/url]

这是java的回调方式.
其实传递给file.list的应该是一个function.
而DirFilter.accept其实就是java的回调方式,DirFilter的接口要求必须有accept这个方法.

如果你写过js,应该比较容易理解
[code="java"]
function clickHandler(){
//do sth
}

someDom.on('click',clickHandler);[/code]

java的话,通过接口来传递function

你就理解为file.list需要一个外部的函数来判断文件名是否符合需求.

而至于这个外部函数是通过接口类来传递,还是其他什么形式,都是语言决定的.

所以可以把java的理解为这种伪代码:
[code="java"]
var myAccept = function(File dir,String name){
Pattern pattern = Pattern.compile(regex);
return pattern.matcher(new File(name).getName()).matches();
}

//把这个函数给别人来调用,就是回调
list = path.list(myAccept);

[/code]

你就理解为file.list需要一个外部的函数来判断文件名是否符合需求.

而至于这个外部函数是通过接口类来传递,还是其他什么形式,都是语言决定的.

所以可以把java的理解为这种伪代码:
[code="java"]
var myAccept = function(File dir,String name){
Pattern pattern = Pattern.compile(regex);
return pattern.matcher(new File(name).getName()).matches();
}

//把这个函数给别人来调用,就是回调
list = path.list(myAccept);

[/code]