更具体地说,这是一个策略模式的例子,因为list()实现了基本功能,而按着形式提供了这个策略,完善list()提供服务所需的算法。
java.io.filenamefilter是文件名过滤器接口,即过滤出符合规则的文件名组。

从io的uml可以看出,filenamefilter接口独立,而且没有它的实现类。下面就看看它的源码:
1
2
3
4
5
6
7
8
9
<code>public</code> <code>interface</code> <code>filenamefilter {</code>
<code> </code><code>/**</code>
<code> </code><code>* 测试指定文件是否应该包含在某一文件列表中。</code>
<code> </code><code>*</code>
<code> </code><code>* @param 被找到的文件所在的目录。</code>
<code> </code><code>* @param 文件的名称</code>
<code> </code><code>*/</code>
<code> </code><code>boolean</code> <code>accept(file dir, string name);</code>
<code>}</code>
从jdk1.0就存在了,功能也很简单:就是为了过滤文件名。只要在accept()方法中传入相应的目录和文件名即可。
深度分析:接口要有真正的实现才能算行为模式中真正实现。所以这里使用的是策略模式,涉及到三个角色:
环境(context)角色 抽象策略(strategy)角色 具体策略(context strategy)角色
结构图如下:
其中,filenamefiler interface 就是这里的抽象策略角色。其实也可以用抽象类实现。
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<code>package</code> <code>org.javacore.io;</code>
<code>import</code> <code>java.io.file;</code>
<code>import</code> <code>java.io.filenamefilter;</code>
<code>/*</code>
<code> </code><code>* copyright [2015] [jeff lee]</code>
<code> </code><code>*</code>
<code> </code><code>* licensed under the apache license, version 2.0 (the "license");</code>
<code> </code><code>* you may not use this file except in compliance with the license.</code>
<code> </code><code>* you may obtain a copy of the license at</code>
<code> </code><code>* unless required by applicable law or agreed to in writing, software</code>
<code> </code><code>* distributed under the license is distributed on an "as is" basis,</code>
<code> </code><code>* without warranties or conditions of any kind, either express or implied.</code>
<code> </code><code>* see the license for the specific language governing permissions and</code>
<code> </code><code>* limitations under the license.</code>
<code> </code><code>*/</code>
<code>/**</code>
<code> </code><code>* @author jeff lee</code>
<code> </code><code>* @since 2015-7-20 13:31:41</code>
<code> </code><code>* 类名过滤器的使用</code>
<code>public class filenamefiltert {</code>
<code> </code><code>public static void main(string[] args) {</code>
<code> </code><code>// io包路径</code>
<code> </code><code>string dir = "src" + file.separator +</code>
<code> </code><code>"org" + file.separator +</code>
<code> </code><code>"javacore" + file.separator +</code>
<code> </code><code>"io";</code>
<code> </code><code>file file = new file(dir);</code>
<code> </code><code>// 创建过滤器文件</code>
<code> </code><code>myfilter filter = new myfilter("y.java");</code>
<code> </code><code>// 过滤</code>
<code> </code><code>string files[] = file.list(filter);</code>
<code> </code>
<code> </code><code>// 打印</code>
<code> </code><code>for (string name : files) {</code>
<code> </code><code>system.err.println(name);</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>* 内部类实现过滤器文件接口</code>
<code> </code><code>static</code> <code>class</code> <code>myfilter </code><code>implements</code> <code>filenamefilter {</code>
<code> </code><code>private</code> <code>string type;</code>
<code> </code><code>public</code> <code>myfilter (string type) {</code>
<code> </code><code>this</code><code>.type = type;</code>
<code> </code><code>@override</code>
<code> </code><code>public</code> <code>boolean</code> <code>accept(file dir, string name) {</code>
<code> </code><code>return</code> <code>name.endswith(type);</code><code>// 以type结尾</code>
其中我们用内部类的实现,实现了filenamefilter interface。所以当我们file list调用接口方法时,传入myfilter可以让文件名规则按我们想要的获得。
右键 run 下,可以看到如图所示的输出:
补充:
string[] fs = f.list() file[] fs = f.listfiles() string []fs = f.list(filenamefilter filter);; file[]fs = f.listfiles(filenamefilter filter);
1、看源码很简单,看怎么用先,在深入看有什么数据结构,设计模式。理理就清楚了 2、学东西,学一点一点深一点。太深不好,一点就够了