内容简介:java io文件过滤器对命令设计模式的使用
一. 点睛
java io 流里面使用到了很多的设计模式,最典型的就是 装饰模式 ,还有 命令模式 。通过对文件过滤器功能的简单使用,可以一窥 java io 流对 命令设计模式 的典型使用。下面分两部分来讲,先举例说说文件过滤器的简单使用,再引申到它是如何使用到命令设计模式的,不会大篇幅讲模式,对命令模式想做更深入的了解请参考其他资料。
二. 示例
我们进行 java 编程的时候,如果想要访问文件或者目录,会使用 File 类, File 是一个很强大的类,不管文件还是目录都可以使用它。如果要遍历文件会使用到 File 类的 list() 方法,它会列出当前 File 对象的所有子文件名和路径名,如果有的文件名或者路径名不想要列出来怎么办? File 类给提供了另外一个重载的具有过滤功能的方法 list(FilenameFilter filter) 可以满足我们的需要,方法声明如下:
public String[] list(FilenameFilter filter);
参数里面的 FilenameFilter 就是文件名过滤接口,该接口有一个方法 accept() 方法,我们自定义的文件名过滤器需要实现该接口,并实现 accept() 方法来自定义规则。 FilenameFilter 接口声明如下所示:
public interface FilenameFilter {
boolean accept(File dir, String name);
}
下面来看具体怎么使用的,含义为列出当前工作空间下所有以 .xml 结尾的文件名或者路径名。
1. 编写自定义文件过滤器:
package org.light4j.io.fileFilter;
import java.io.File;
import java.io.FilenameFilter;
/**
* 自定义文件名过滤器
*
* @author longjiazuo
*
*/
public class MyFilenameFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
// 如果文件以.xml结尾则符合条件返回true
return name.endsWith(".xml");
}
}
2. 编写测试类
package org.light4j.io.fileFilter;
import java.io.File;
/**
* 文件过滤器测试
*
* <p>
* 列出当前工作目录下符合条件的所有子文件名和路径名
* </p>
*
* @author longjiazuo
*
*/
public class FilenameFilterTest {
public static void main(String[] args) {
// 获取工作目录
String workDir = System.getProperty("user.dir");
File file = new File(workDir);
// 列举当前工作目录下的所有文件
String[] files = file.list(new MyFilenameFilter());
// 循环遍历
for (String string : files) {
System.out.println(string);
}
}
}
运行上面代码可以在控制台看到只列出以 .xml 结尾的文件名或者路径名。
三. 命令设计模式
命令模式是关于如何处理一个对象请求另外一个对象调用其方法完成某项功能的设计模式,当一个对象请求另外一个对象调用其方法时,并不和被请求的对象直接交互,而是把这种请求封装到一个命令对象中,具体做法是将请求封装在命令对象的一个方法里,将命令对象作为参数传递。 命令模式的核心就是使用命令对象来封装方法的调用。
在项目中,我们不会只有一个类,所以经常涉及一个对象请求另外一个对象调用它的方法来达到某种目的。如果请求者这时候不希望或者无法直接和被请求者进行交互,换句话说就是请求者不包含被请求者的引用,那么这个时候二者如何进行交互?我们可以使用命令模式来达到目的。例如,我们日常点外卖,我们并不直接和饭店打交道,而是会上美团等外卖网站购买,外卖网站会把你要买外卖的请求作为一个点餐命令告诉饭店,只要该点餐命令被成功传递给饭店,你就一定能够收到外卖。
现在回到文件过滤器的使用上面来, File 类的 list(FilenameFilter filter) 方法通过使用一个接口对象作为参数来实现过滤文件名的功能,具体的规则定义则是在 FilenameFilter 接口子类的方法 accept() 里面来实现的,这就是对 命令设计模式 的使用。
按道理,既然 list(FilenameFilter filter) 方法想要一个判断哪些文件需要被列出来的规则,那我们把规则传进去就行了,这个规则是一个代码块,但是目前的 java 并不支持向方法里面传入代码块的做法,所以 java 使用了 FilenameFilter 的 accept() 方法来封装判断规则,传入的 MyFilenameFilter 对象的作用其实是为了传入 accept() 方法的方法体,这个方法体的作用就是判断哪些文件名或者路径名符合规则, list(FilenameFilter filter) 的实现源码如下所示:
四. 源代码示例
github 地址: 点击查看
码云地址: 点击查看
欢迎关注人生设计师的微信公众账号
公众号ID:longjiazuoA
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
基于MVC的JavaScript Web富应用开发
麦卡劳(Alex MacCaw) / 李晶、张散集 / 电子工业出版社 / 2012-5 / 59.00元
《JavaScript Web 富应用开发》Developing JavaScript Web Applications是 Alex MacCaw 的新作(由O'Reilly出版发行),本书系统而深入的讲解了如何使用最前沿的Web技术构建下一代互联网富应用程序。作者 Alex MacCaw 是一名Ruby/JavaScript 程序员,在开源社区中很有名望,是Spine框架的作者,同时活跃在纽约、......一起来看看 《基于MVC的JavaScript Web富应用开发》 这本书的介绍吧!