<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Flyingis

    Talking and thinking freely !
    Flying in the world of GIS !
    隨筆 - 156, 文章 - 16, 評(píng)論 - 589, 引用 - 0
    數(shù)據(jù)加載中……

    Java I/O中的設(shè)計(jì)模式

    作者:Flyingis

        任何程序語言的
    I/O設(shè)計(jì)都是一項(xiàng)具有挑戰(zhàn)的任務(wù),因?yàn)閿?shù)據(jù)的傳輸存在多種可能,這些可能不僅存在于數(shù)據(jù)發(fā)送端和接收端(文件、網(wǎng)絡(luò)鏈接等),還存在于這些數(shù)據(jù)的多種存在方式,例如緩沖區(qū)數(shù)據(jù)、順序存取數(shù)據(jù)、字符數(shù)據(jù)、字節(jié)數(shù)據(jù)等等。

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

    Strategy設(shè)計(jì)模式

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

    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());  //比較時(shí)不考慮大小寫

    }

    }

     

    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]);

    }

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

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

    Decorator設(shè)計(jì)模式

    http://www.j2eesp.com上有對(duì)Decorator設(shè)計(jì)模式的定義:動(dòng)態(tài)給一個(gè)對(duì)象添加一些額外的職責(zé),就像在墻上刷油漆。使用Decorator模式相比用生成子類方式達(dá)到功能的擴(kuò)充顯得更為靈活。Decorator模式規(guī)定所有封裝于初始對(duì)象內(nèi)部的對(duì)象具有相同的接口,這使得該模式的應(yīng)用具有透明性。

    Java I/O設(shè)計(jì)中,Decorator模式主要體現(xiàn)在filter類的設(shè)計(jì)上,抽象類filter是所有Decorator模式類的基類。但是Decorator模式同樣存在缺點(diǎn):在編寫程序時(shí),它在給開發(fā)人員提供了靈活性的同時(shí),增加了代碼的復(fù)雜性,造成了Java I/O類操作不便,因?yàn)楹芏?/SPAN>I/O設(shè)計(jì)中都需要應(yīng)用Decorator模式,增加一些類來完成該設(shè)計(jì)。

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

    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模式設(shè)計(jì),這兩個(gè)類可以更換為其他具有相同功用的類(在Thinking in Java中稱為“修飾器”類)來組合完成特定的任務(wù),正如上文所述,這給開發(fā)者提供了多種組合方式,同時(shí)也相對(duì)的增加了復(fù)雜度。

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

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

    評(píng)論

    # re: Java I/O中的設(shè)計(jì)模式  回復(fù)  更多評(píng)論   

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

    # re: Java I/O中的設(shè)計(jì)模式  回復(fù)  更多評(píng)論   

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

    # re: Java I/O中的設(shè)計(jì)模式  回復(fù)  更多評(píng)論   

    @ yesjoy
    剛看到,現(xiàn)在有事,待會(huì)回復(fù)。
    2006-01-17 17:54 | Flyingis

    # re: Java I/O中的設(shè)計(jì)模式  回復(fù)  更多評(píng)論   

    @ yesjoy
    有個(gè)很明顯的錯(cuò)誤,"return new FilenameFilter"寫漏了一個(gè)括號(hào),應(yīng)該改為"return new FilenameFilter()",另外AlphabeticComparator應(yīng)該單獨(dú)寫成一個(gè)文件。
    代碼已經(jīng)更改。
    2006-01-17 19:57 | Flyingis
    主站蜘蛛池模板: 四虎免费影院ww4164h| 亚洲自偷自拍另类图片二区| 可以免费看的卡一卡二| jizz日本免费| 亚洲人成电影网站免费| 亚洲精品国产免费| 亚洲欧洲美洲无码精品VA | 久久综合日韩亚洲精品色| 日韩免费福利视频| 国产成人精品久久免费动漫| 十八禁视频在线观看免费无码无遮挡骂过 | 亚洲中久无码永久在线观看同| 成熟女人牲交片免费观看视频| 69视频在线观看高清免费| 精品无码一级毛片免费视频观看 | 日韩精品免费一区二区三区| 91精品国产免费入口| 国产一区二区三区免费观看在线| 免费无码国产在线观国内自拍中文字幕| 亚洲色精品VR一区区三区| 亚洲精品偷拍无码不卡av| 亚洲天堂中文字幕| 亚洲av永久无码制服河南实里| 亚洲中文字幕成人在线| 亚洲国产精品自在拍在线播放| 国产成人综合久久精品免费 | 亚洲日韩中文字幕无码一区| 亚洲成aⅴ人片在线观| 亚洲熟妇av一区| 亚洲国产午夜精品理论片| 亚洲欧洲尹人香蕉综合| 亚洲欧洲久久精品| 亚洲另类自拍丝袜第1页| 亚洲免费网站在线观看| 亚洲人成网站日本片| 亚洲一区二区三区91| 国产精品高清视亚洲一区二区 | 香蕉高清免费永久在线视频| 成人免费男女视频网站慢动作| 亚洲色偷偷综合亚洲av78| 亚洲首页国产精品丝袜|