| 導購 | 订阅 | 在线投稿
分享
 
 
 

從Decorator,Adapter模式看Java/IO庫(一)

來源:互聯網  2007-09-22 05:02:37  評論

我想任何一本介紹模式的書在講到Decorator模式的時候不能不提到它的實際應用--在Java/IO庫裏面的應用,<<Java與模式>>這本書也不例外,有點不一樣的是,這本書在介紹的時候有個專題,是從兩個模式來看Java/IO庫,完這個專題後,個人感覺對Java/IO庫有了全新的認識同時也加深了Decorator模式跟Adapter適配器模式的理解,現和大家分享下這個在我看來很偉大的成果,同時說明下,以下大部分文字跟圖片是來自<<Java與模式>>這本書。

一.引子(概括地介紹Java的IO)

無論是哪種編程語言,輸入跟輸出都是重要的一部分,Java也不例外,而且Java將輸入/輸出的功能和使用範疇做了很大的擴充。它采用了流的機制來實現輸入/輸出,所謂流,就是數據的有序排列,而流可以是從某個源(稱爲流源或Source of Stream)出來,到某個目的地(稱爲流彙或Sink of Stream)去的。由流的方向,可以分成輸入流和輸出流,一個程序從輸入流讀取數據向輸出流寫數據。

如,一個程序可以用FileInputStream類從一個磁盤文件讀取數據,如下圖所示:

王朝网络

像FileInputStream這樣的處理器叫做流處理器,它就像流的管道一樣,從一個流源吸入某種類型的數據,並輸出某種類型的數據。上面這種示意圖叫做流的管道圖。

同樣道理,也可以用FileOutputStream類向一個磁盤文件寫數據,如下圖所示:

王朝网络

在實際應用這種機制並不沒有太大的用處,程序需要寫出地通常是非常結構化的信息,因此這些byte類型的數據實際上是一些數值,文字,源代碼等。Java的I/O庫提供了一個稱做鏈接(Chaining)的機制,可以將一個流處理器跟另一個流處理器首尾相接,以其中之一的輸出爲輸入,形成一個流管道的鏈接。

例如,DataInputStream流處理器可以把FileInputStream流對象的輸出當作輸入,將Byte類型的數據轉換成Java的原始類型和String類型的數據。如下圖所示:

王朝网络

類似地,向一個文件寫入Byte類型的數據不是一個簡單的過程。一個程序需要向一個文件裏寫入的數據往往都是結構化的,而Byte類型則是原始類型。因此在寫的時候必須經過轉換。DataOutputStream流處理器提供了接收了原始數據類型和String數據類型,而這個流處理器的輸出數據則是Byte類型。也就是說DataOutputStream可以將源數據轉換成Byte類型的數據,再輸出來。

這樣一來,就可以將DataOutputStream與FileOutputStream鏈接起來,這樣程序就可以將原始數據類型和String類型的源數據寫入這個鏈接好的雙重管道裏面,達到將結構化數據寫到磁盤文件裏面的目的,如下圖所示:

王朝网络

這又是鏈接的所發揮的大作用。

流處理器所處理的流必定都有流源,而如果將流類所處理的流源分類的話,基本可以分成兩大類:

第一數組,String,File等,這一種叫原始流源。

第二同樣類型的流用做鏈接流類的流源,叫鏈接流源。

二Java I/O庫的設計原則

Java語言的I/O庫是對各種常見的流源,流彙以及處理過程的抽象化。客戶端的Java程序不必知道最終的流源,流彙是磁盤上的文件還是數組等;也不必關心數據是否經過緩沖的,可否按照行號讀取等處理的細節。

書中提到了,對于第一次見到Java/IO庫的人,無不因爲這個庫的龐雜而感到困惑;而對于熟悉這個庫的人,而又常常爲這個庫的設計是否得當而爭論不體。書的作者提出自己的意見,要理解Java I/O這個龐大而複雜的庫,關鍵是要掌握兩個對稱性跟兩個設計模式模式。

Java I/O庫具有兩個對稱性,它們分別是:

1輸入-輸出對稱性,比如InputStream和OutputStream各自占據Byte流的輸入與輸出的兩個平行的等級結構的根部。而Reader和Writer各自占據Char流的輸入與輸出的兩個平行的等級結構的根部。

2byte-char對稱,InputStream和Reader的子類分別負責Byte和Char流的輸入;OutputStream和Writer的子類分別負責Byte和Char流的輸出,它們分別形成平行的等級結構。

Java I/O庫的兩個設計模式:

Java的I/O庫總體設計是符合裝飾者模式(Decorator)跟適配器模式(Adapter)的。如前所述,這個庫中處理流的類叫做流類。引子裏所談到的FileInputStream,FileOutputStream,DataInputStream及DataOutputStream都是流處理器的例子。

1裝飾者模式:在由InputStream,OutputStream,Reader和Writer代表的等級結構內部,有一些流處理器可以對另一些流處理器起到裝飾作用,形成新的,具有改善了的功能的流處理器。裝飾者模式是Java I/O庫的整體設計模式。這樣的一個原則是符合裝飾者模式的,如下圖所示:

王朝网络

2適配器模式:在由InputStream,OutputStream,Reader和Writer代表的等級結構內部,有一些流處理器是對其它類型的流源的適配。這就是適配器模式的應用,如下圖所示。

王朝网络

適配器模式應用到了原始流處理器的設計上面,構成了I/O庫所有流處理器的起點。

今天晚上先到這了,明天再接著細看兩種設計模式具體是怎樣在I/O庫中被應用的。

 我想任何一本介紹模式的書在講到Decorator模式的時候不能不提到它的實際應用--在Java/IO庫裏面的應用,<<Java與模式>>這本書也不例外,有點不一樣的是,這本書在介紹的時候有個專題,是從兩個模式來看Java/IO庫,完這個專題後,個人感覺對Java/IO庫有了全新的認識同時也加深了Decorator模式跟Adapter適配器模式的理解,現和大家分享下這個在我看來很偉大的成果,同時說明下,以下大部分文字跟圖片是來自<<Java與模式>>這本書。  一.引子(概括地介紹Java的IO)  無論是哪種編程語言,輸入跟輸出都是重要的一部分,Java也不例外,而且Java將輸入/輸出的功能和使用範疇做了很大的擴充。它采用了流的機制來實現輸入/輸出,所謂流,就是數據的有序排列,而流可以是從某個源(稱爲流源或Source of Stream)出來,到某個目的地(稱爲流彙或Sink of Stream)去的。由流的方向,可以分成輸入流和輸出流,一個程序從輸入流讀取數據向輸出流寫數據。  如,一個程序可以用FileInputStream類從一個磁盤文件讀取數據,如下圖所示:  [url=/bbs/detail_999989.html][img]http://images.wangchao.net.cn/images/upload/images/lsdn/1190408556677.jpg[/img][/url]  像FileInputStream這樣的處理器叫做流處理器,它就像流的管道一樣,從一個流源吸入某種類型的數據,並輸出某種類型的數據。上面這種示意圖叫做流的管道圖。  同樣道理,也可以用FileOutputStream類向一個磁盤文件寫數據,如下圖所示:  [url=/bbs/detail_999989.html][img]http://images.wangchao.net.cn/images/upload/images/lsdn/1190408556817.jpg[/img][/url]   在實際應用這種機制並不沒有太大的用處,程序需要寫出地通常是非常結構化的信息,因此這些byte類型的數據實際上是一些數值,文字,源代碼等。Java的I/O庫提供了一個稱做鏈接(Chaining)的機制,可以將一個流處理器跟另一個流處理器首尾相接,以其中之一的輸出爲輸入,形成一個流管道的鏈接。  例如,DataInputStream流處理器可以把FileInputStream流對象的輸出當作輸入,將Byte類型的數據轉換成Java的原始類型和String類型的數據。如下圖所示: [url=/bbs/detail_999989.html][img]http://images.wangchao.net.cn/images/upload/images/lsdn/1190408556958.jpg[/img][/url]  類似地,向一個文件寫入Byte類型的數據不是一個簡單的過程。一個程序需要向一個文件裏寫入的數據往往都是結構化的,而Byte類型則是原始類型。因此在寫的時候必須經過轉換。DataOutputStream流處理器提供了接收了原始數據類型和String數據類型,而這個流處理器的輸出數據則是Byte類型。也就是說DataOutputStream可以將源數據轉換成Byte類型的數據,再輸出來。  這樣一來,就可以將DataOutputStream與FileOutputStream鏈接起來,這樣程序就可以將原始數據類型和String類型的源數據寫入這個鏈接好的雙重管道裏面,達到將結構化數據寫到磁盤文件裏面的目的,如下圖所示:  [url=/bbs/detail_999989.html][img]http://images.wangchao.net.cn/images/upload/images/lsdn/1190408557146.jpg[/img][/url]  這又是鏈接的所發揮的大作用。  流處理器所處理的流必定都有流源,而如果將流類所處理的流源分類的話,基本可以分成兩大類:  第一 數組,String,File等,這一種叫原始流源。  第二 同樣類型的流用做鏈接流類的流源,叫鏈接流源。  二 Java I/O庫的設計原則  Java語言的I/O庫是對各種常見的流源,流彙以及處理過程的抽象化。客戶端的Java程序不必知道最終的流源,流彙是磁盤上的文件還是數組等;也不必關心數據是否經過緩沖的,可否按照行號讀取等處理的細節。  書中提到了,對于第一次見到Java/IO庫的人,無不因爲這個庫的龐雜而感到困惑;而對于熟悉這個庫的人,而又常常爲這個庫的設計是否得當而爭論不體。書的作者提出自己的意見,要理解Java I/O這個龐大而複雜的庫,關鍵是要掌握兩個對稱性跟兩個設計模式模式。 Java I/O庫具有兩個對稱性,它們分別是:  1 輸入-輸出對稱性,比如InputStream和OutputStream各自占據Byte流的輸入與輸出的兩個平行的等級結構的根部。而Reader和Writer各自占據Char流的輸入與輸出的兩個平行的等級結構的根部。  2 byte-char對稱,InputStream和Reader的子類分別負責Byte和Char流的輸入;OutputStream和Writer的子類分別負責Byte和Char流的輸出,它們分別形成平行的等級結構。 Java I/O庫的兩個設計模式: Java的I/O庫總體設計是符合裝飾者模式(Decorator)跟適配器模式(Adapter)的。如前所述,這個庫中處理流的類叫做流類。引子裏所談到的FileInputStream,FileOutputStream,DataInputStream及DataOutputStream都是流處理器的例子。  1 裝飾者模式:在由InputStream,OutputStream,Reader和Writer代表的等級結構內部,有一些流處理器可以對另一些流處理器起到裝飾作用,形成新的,具有改善了的功能的流處理器。裝飾者模式是Java I/O庫的整體設計模式。這樣的一個原則是符合裝飾者模式的,如下圖所示: [url=/bbs/detail_999989.html][img]http://images.wangchao.net.cn/images/upload/images/lsdn/1190408557239.jpg[/img][/url] 2 適配器模式:在由InputStream,OutputStream,Reader和Writer代表的等級結構內部,有一些流處理器是對其它類型的流源的適配。這就是適配器模式的應用,如下圖所示。   [url=/bbs/detail_999989.html][img]http://images.wangchao.net.cn/images/upload/images/lsdn/1190408557333.jpg[/img][/url]  適配器模式應用到了原始流處理器的設計上面,構成了I/O庫所有流處理器的起點。  今天晚上先到這了,明天再接著細看兩種設計模式具體是怎樣在I/O庫中被應用的。  
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有