上篇扩展了怎样用封装的形式去搜索不同类型的文件。【理解“封装”之搜索文件夹下指定类型的文件】在我们将搜索不同类型文件的操作封装成一个方法后,看上去似乎是完工了。但是此刻,老板突然过来,说:这个程序不错,可以做成一个jar给公司的其他同事用。
我们把它打包成jar包,发给老板,老板说:我想搜包含"java"这个单词的所有文件。于是我们在isSearchFile里面加了段模糊搜索的逻辑,又打了个jar包给老板。
这时他又说:我想搜不包含"java"这个单词的所有文件。我们又加了段搜索不包含"xxx"单词的逻辑。
老板又说:我想搜索"test1.java","test2.java","test3.java"这样的数字后缀的文件,含英文或其他字符的不要。于是我们又加了段逻辑。
这时我们回过头一看,searchFile已经是很长的一段代码了,我们没有立刻把jar包给老板,而是在想,这样下去不行,鬼知道他待会又要搜索什么东西。
我们觉得,我们的代码需要优化一下。但是该怎样优化呢?我们无法预测到老板想要的所有搜索条件,既然是要面对未知的事物,那我们就用接口吧。
我们把isSearchFile方法抽象成了一个接口。如下
/**
* 接口
*
* @author liuming
* @since 2016-9-23
*/
public interface FileSearchService {
/***
* 文件搜索接口
* @param path
* @return
*/
boolean isSearchFile(String path);
}
在FileSearch里面简单的实现了这个接口,并向外提供一个实例化接口的方法。
/**
* 文件搜索
*
* @author liuming
* @since 2016-9-23
*/
public class FileSearch {
/***
* 文件搜索接口
*/
private FileSearchService searchService=new FileSearchService() {
@Override
public boolean isSearchFile(String path) {
return false;
}
};
/**
* 设置文件搜索接口
* @param searchService 文件搜索接口
*/
public void setSearchService(FileSearchService searchService) {
this.searchService = searchService;
}
/**
* 文件搜索主程序
* @param path
*/
public void searchFolder(String path){
File file=new File(path);
if(file.exists()){
File[] files=file.listFiles();
if(files.length>0){
for(int i=0;i<files.length;i++){
if(files[i].isDirectory()){
System.out.println(">>>进入文件夹:"+files[i].getAbsolutePath());
searchFolder(files[i].getAbsolutePath());
}else{
// if(isSearchFile(files[i].getAbsolutePath())){
// System.out.println(files[i].getAbsolutePath());
// }
if(searchService.isSearchFile(files[i].getAbsolutePath())){
System.out.println(files[i].getAbsolutePath());
}
}
}
}else{
System.out.println(path+"[文件夹下没有文件夹或文件]");
}
}else{
System.out.println(path+"[文件夹不存在]");
}
}
}
上章的内容在测试代码中我们这样写:
/**
* 测试类
*
* @author liuming
* @since 2016-9-23
*/
public class FileSearchTest {
public static void main(String[] args) {
FileSearch fsearch=new FileSearch();
fsearch.setSearchService(service);
fsearch.searchFolder("D:\\aa");
System.out.println("======搜索含有'2016'字符串的文件======");
fsearch.setSearchService(searchStrService);
fsearch.searchFolder("D:\\aa");
}
/**允许搜索的文件类型*/
public final static String[] SEARCH_TYPE=new String[]{".mp4",".rmvb",".avi",".jpg","qvod.exe"};
/**声明一个接口实现对象*/
private static FileSearchService service=new FileSearchService() {
@Override
public boolean isSearchFile(String path) {
for(int i=0;i<SEARCH_TYPE.length;i++){
if(path.toLowerCase().endsWith(SEARCH_TYPE[i])){
return true;
}
}
return false;
}
};
private static FileSearchService searchStrService=new FileSearchService() {
@Override
public boolean isSearchFile(String path) {
if(path.indexOf("2016")!=-1){
return true;
}
return false;
}
};
}
改完之后,我们把代码打成jar包,发给老板(附带了测试文件的代码)。
没过多久,老板又说:HI,Boy,我想搜索test开头的没有数字结尾的文件。
"我们已经提供了接口,自己参考测试文件去写!"
对比这个用接口实现的文件搜索,很明显比用一个方法更加灵活。使用接口,完全的将文件搜索这个动作抽离出来,FileSearchService做什么处理和FileSearch的业务逻辑没有任何关系。至此,我们去修改文件搜索的逻辑已经和FileSearch没有任何关系了。