您好,登錄后才能下訂單哦!
本篇文章為大家展示了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)的實現源碼如下所示:
上述內容就是Java中的命令設計模式如何利用IO文件過濾器使用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。