更具體地說,這是一個政策模式的例子,因為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、學東西,學一點一點深一點。太深不好,一點就夠了