FilenameFilter接口

在學習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的繼承和多態的思想嘛,感覺也沒什麼特殊的。嗯,目前就先這樣理解把,以後有了新的想法,再來補充。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章