FilenameFilter接口

来源:互联网 发布:淘宝联盟购物车 编辑:程序博客网 时间:2024/05/18 02:38

在学习Java IO的时候,提到了File类,File类的对象中有两个list方法:

list():不带参数,可以获得此File对象包含的全部列表

list(FilenameFilter filter):获取受限的列表,相当于一个过滤器,把不符合条件的File对象过滤掉。

在Java编程思想这本书里面对第二个方法描述得可高端了:DirFilter这个类存在的唯一原因是accept()方法,创建这个类的目的在于把accept()方法提供给list()使用,使list()可以回调accept(),进而决定哪些文件包含在列表中。因此,这种结构也称为回调。更具体的说,这是一个策略模式的例子,因为list()实现了基本的功能,且按照FilenameFilter的形式提供了这个策略,以便完善list()在提供服务时所需的算法。因为list()接受FilenameFilter对象作为参数,这意味着我们可以传递任何实现了FilenameFilter接口的类的对象,用以选择list()方法的行为模式。

对于第二个方法,我怀着好奇的心理去查看了它的源码,发现功能确实是上面描述的那样,就是先调用无参的list()方法,然后调用FilenameFilter对象的accept()方法进行过滤,将符合条件的加入到返回数组中,最后返回。


这里面比较重要的思想应该就是策略模式了,自己之前没有接触过设计模式,所以也不懂什么是策略模式,于是上网补了补。发现网上出现最多的是下面这张图,我也贴出来。


策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。下面就以一个示意性的实现讲解策略模式实例的结构。

这个模式涉及到三个角色:

  ●  环境(Context)角色:持有一个Strategy的引用。

  ●  抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  ●  具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

我觉得这个应该是设计模式里面最好理解的一个了,就是,利用Java的继承和多态的思想嘛,感觉也没什么特殊的。嗯,目前就先这样理解把,以后有了新的想法,再来补充。


原创粉丝点击