Flyingis

          Talking and thinking freely !
          Flying in the world of GIS !
          隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0
          數據加載中……

          Java I/O中的設計模式

          作者:Flyingis

              任何程序語言的
          I/O設計都是一項具有挑戰的任務,因為數據的傳輸存在多種可能,這些可能不僅存在于數據發送端和接收端(文件、網絡鏈接等),還存在于這些數據的多種存在方式,例如緩沖區數據、順序存取數據、字符數據、字節數據等等。

          JavaI/O使用“流”這個抽象的概念,它屏蔽了實際的I/O設備中處理數據的細節。在實際的應用中,我們很少使用單一的類來創建流對象,而是通過多個對象來提供所需要的I/O功能。Java1.01.11.4I/O類庫作了多次重大修改,具體的可以參考相關的書籍或Sun官方網站。這里是從模式的角度來分析JavaI/O類庫的設計。

          Strategy設計模式

          將會發生變化的代碼封裝在單獨的類(Strategy對象)中,供其他保持不變的類使用,實現某種算法或應用,這是Strategy設計模式的一般思想。在Java I/O中,一個典型的應用是File類,它可以代表一個特定文件的名稱,也可以代表一個目錄下一組文件的名稱。當我們要查詢顯示一個目錄下特定文件類型的所有文件對象信息時,就需要將這個目錄下的文件過濾,找到所需要的對象。

          import java.io.*;

          import java.util.*;

          import java.util.regex.*;

           

          public class AlphabeticComparator implements Comparator {

          public int compare(Object o1, Object o2) {

            String s1 = (String)o1;

            String s2 = (String)o2;

            return s1.toLowerCase().compareTo(s2.toLowerCase());  //比較時不考慮大小寫

          }

          }

           

          public class FruitList {

            public static FilenameFilter filter(final String regex) {

          return new FilenameFilter() {

            private Pattern pattern = Pattern.compile(regex);

            public boolean accept(File dir, String name) {

              return pattern.matcher(new File(name).getName()).matches();

          }

          };

          }

          public static void main(String[] args) {

            File path = new File(“.”);

            String[] list;

            if (args.length == 0)

              list = path.list();  //搜索出該目錄下所有類型的文件

          else

            list = path.list(filter(args[0]));  //搜索出該目錄下指定類型的文件

          Arrays.sort(list, new AlphabeticComparator());

          for (int i = 0; i < list.length; i++)

            System.out.println(list[i]);

          }

          }在上述代碼中,有兩個地方使用了Strategy設計模式,一個是AlphabeticComparator類,用來在忽略字符串大小寫的情況下提供排序的規則,另一個就是FilenameFilter接口,使用了匿名內部類的設計,然后將其中實現的accept()規則提供給File類的list方法使用。這里是用來判斷正則表達式regex是否和文件名匹配,當運行程序在命令操作符中輸入“E.*\.java”時,搜索到的是該目錄下所有.java文件。

          File類除了上述用法外,還可以創建或刪除目錄,查看文件的信息,包括文件大小、最后修改日期,讀寫狀態等,具體的可以參考JDK文檔。

          Decorator設計模式

          http://www.j2eesp.com上有對Decorator設計模式的定義:動態給一個對象添加一些額外的職責,就像在墻上刷油漆。使用Decorator模式相比用生成子類方式達到功能的擴充顯得更為靈活。Decorator模式規定所有封裝于初始對象內部的對象具有相同的接口,這使得該模式的應用具有透明性。

          Java I/O設計中,Decorator模式主要體現在filter類的設計上,抽象類filter是所有Decorator模式類的基類。但是Decorator模式同樣存在缺點:在編寫程序時,它在給開發人員提供了靈活性的同時,增加了代碼的復雜性,造成了Java I/O類操作不便,因為很多I/O設計中都需要應用Decorator模式,增加一些類來完成該設計。

          例如在Java 1.0中,FilterInputStreamInputStream中讀取數據,FilterOutPutStreamOutputStream中寫入數據,在Java 1.1中,相應的有FilterReaderFilterWriter(抽象類,沒有子類)用于Decorator模式設計。舉個簡單的例子:

          import java.io.*;

          public class DecoratorDemo {

            public static void main(String[] args) {

          BufferedReader in = new BufferedReader(new FileReader(“FruitList.java”));

          String s = new String();

          while ((s = in.readLine()) != null)

            System.out.println(s);

          in.close();

          }

          }

              BufferedReaderFileReader完成了Decorate模式設計,這兩個類可以更換為其他具有相同功用的類(在Thinking in Java中稱為“修飾器”類)來組合完成特定的任務,正如上文所述,這給開發者提供了多種組合方式,同時也相對的增加了復雜度。

              最后,祝blogjava所有成員和Java、開源愛好者元旦快樂!幸福安康!

          posted on 2005-12-30 21:47 Flyingis 閱讀(2589) 評論(4)  編輯  收藏 所屬分類: JavaSE

          評論

          # re: Java I/O中的設計模式  回復  更多評論   

          贊一個,特別是最后一句話 :)
          2005-12-31 09:37 | 胡子魚

          # re: Java I/O中的設計模式  回復  更多評論   

          為什么第一個程序執行時有這樣的錯誤信息:
          E:\myprogram>javac FruitList.java
          FruitList.java:9: 需要 "(" 或 "["
          return new FilenameFilter {
          ^
          1 錯誤
          2006-01-17 17:25 | yesjoy

          # re: Java I/O中的設計模式  回復  更多評論   

          @ yesjoy
          剛看到,現在有事,待會回復。
          2006-01-17 17:54 | Flyingis

          # re: Java I/O中的設計模式  回復  更多評論   

          @ yesjoy
          有個很明顯的錯誤,"return new FilenameFilter"寫漏了一個括號,應該改為"return new FilenameFilter()",另外AlphabeticComparator應該單獨寫成一個文件。
          代碼已經更改。
          2006-01-17 19:57 | Flyingis
          主站蜘蛛池模板: 泰安市| 南部县| 浦县| 同仁县| 福海县| 云浮市| 巴林左旗| 教育| 镇远县| 达孜县| 土默特左旗| 榆中县| 宝清县| 丹江口市| 广河县| 丰原市| 天峻县| 化隆| 庆阳市| 安西县| 宁陵县| 五原县| 阿鲁科尔沁旗| 辽宁省| 呼图壁县| 平利县| 金寨县| 邢台市| 桑植县| 石狮市| 边坝县| 临猗县| 得荣县| 寿阳县| 秭归县| 修文县| 策勒县| 乌拉特后旗| 陆河县| 田东县| 怀集县|