18.1.1 目录列表器

一个利用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);
		}
	}
}

在这个匿名内部类改写例子的基础上, 书中提到了匿名内部类应用在代码中的优缺点:

优点: 将解决特定问题的代码隔离, 聚拢在一点

缺点: 不易阅读(这个是显而易见的)

我觉得只要运用纯熟, 匿名内部类对编写特定代码还是很好的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值