一个利用FILE类获取文件列表的示例, 示例中利用过滤器实现了列表过滤
package com.cnsuning.src;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
File dir = new File("D:\\download");
String[] dirList;
if(args.length==0){
dirList = dir.list();
}
else{
dirList = dir.list(new DirFilter(args[0]));
}
Arrays.sort(dirList,String.CASE_INSENSITIVE_ORDER);
for(String fileName : dirList){
System.out.println(fileName);
}
}
}
class DirFilter implements FilenameFilter{
private Pattern pattern;
DirFilter (String preg){
pattern = Pattern.compile(preg);
}
@Override
public boolean accept(File file, String fileName) {
// TODO Auto-generated method stub
return pattern.matcher(fileName).matches();
}
}
命令好参数:[\w]*\.zip
结果:
AdbeRdr940_zh_CN.zip
JAVAAPI_CN.zip
qrcode.zip
SQLyogTrial.zip
特别的, 书中提到这里的list()和过滤器结合使用是一种命令模式的思想, list 在设计中是会接收一个FilenameFilter接口来实现文件列表过滤, 而具体的策略由用户实现接口来决定. 可见策略模式的核心思想是利用接口来实现, 通过暴露可编码接口给用户实现具体算法无关性的便利. 而策略这个词更多的体现的是应用场景, 说的是接口支持的一组策略这种场景, 体现了该设计的便利性和合理性.
上边的代码还可以改写为匿名内部类的实现方式
package com.cnsuning.src;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
File dir = new File("D:\\download");
String[] dirList;
if(args.length==0){
dirList = dir.list();
}
else{
dirList = dir.list(getNameFilter(args[0]));
}
Arrays.sort(dirList,String.CASE_INSENSITIVE_ORDER);
for(String fileName : dirList){
System.out.println(fileName);
}
}
public static FilenameFilter getNameFilter(final String regex){
return new FilenameFilter(){
Pattern namePattern = Pattern.compile(regex); //使用的外部变量必须为final
public boolean accept(File file,String fileName){
return namePattern.matcher(fileName).matches();
}
};
}
}
更近一步的, 匿名内部类还可以做为参数出现
package com.cnsuning.src;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.regex.Pattern;
public class Main {
public static void main(final String[] args) {
File dir = new File("D:\\download");
String[] dirList;
if(args.length==0){
dirList = dir.list();
}
else{
dirList = dir.list(new FilenameFilter(){
Pattern namePattern = Pattern.compile(args[0]); //使用的外部变量必须为final
public boolean accept(File file,String fileName){
return namePattern.matcher(fileName).matches();
}
});
}
Arrays.sort(dirList,String.CASE_INSENSITIVE_ORDER);
for(String fileName : dirList){
System.out.println(fileName);
}
}
}
在这个匿名内部类改写例子的基础上, 书中提到了匿名内部类应用在代码中的优缺点:
优点: 将解决特定问题的代码隔离, 聚拢在一点
缺点: 不易阅读(这个是显而易见的)
我觉得只要运用纯熟, 匿名内部类对编写特定代码还是很好的.