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

我想任何一本介紹模式的書在講到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,Adapter模式看Java/IO庫(三)
 四 適配器模式的應用 適配器模式是Java I/O庫中第二個最爲重要的設計模式。 InputStream原始流處理器中的適配器模式 InputStream類型的原始流處理器是適配器模式的應用。 ByteArrayInputStream是一個適配器類...查看完整版>>從Decorator,Adapter模式看Java/IO庫(三)
 
JAVA IO 包中的Decorator模式
JAVA IO 包中的Decorator模式
  JDK爲程序員提供了大量的類庫,而爲了保持類庫的可重用性,可擴展性和靈活性,其中使用到了大量的設計模式,本文將介紹JDK的I/O包中使用到的Decorator模式,並運用此模式,實現一個新的輸出流類。   Decorator...查看完整版>>JAVA IO 包中的Decorator模式
 
Java IO 包中的Decorator模式
Java IO 包中的Decorator模式
  JDK爲程序員提供了大量的類庫,而爲了保持類庫的可重用性,可擴展性和靈活性,其中使用到了大量的設計模式,本文將介紹JDK的I/O包中使用到的Decorator模式,並運用此模式,實現一個新的輸出流類。   Decorator...查看完整版>>Java IO 包中的Decorator模式
 
異常java.sql.SQLException: Io exception:The Network Adapter could not establish connection
Oracle Database Connection (from oracle.com) PROBLEM You are attempting to connect to an Oracle instance using JDBC and you are receiving the following error. java.sql.SQLException: Io ex...查看完整版>>異常java.sql.SQLException: Io exception:The Network Adapter could not establish connection
 
使用Decorator模式 翻譯者:Disneytiger
  使用Decorator模式  Java程序員知道可以通過擴展一個類來改變類的行爲和擴展一個類的功能。這個行爲被稱爲繼續,它是面向對象編程的一個重要的特性.  舉例來說,假如你想得到一個帶有邊框的Swing類型標簽,你可...查看完整版>>使用Decorator模式 翻譯者:Disneytiger
 
使用Decorator模式添加功能
  作者:eclipse     可能你已經在用Decorator模式了,但是跟所有其他模式一樣,知道你爲什麽使用它,學習使用它跟別的開發者溝通是很重要的。      Decorator模式,即Wrapper模式,其強制控制作用是在...查看完整版>>使用Decorator模式添加功能
 
使用Decorator模式添加功能
  作者:eclipse  可能你已經在用Decorator模式了,但是跟所有其他模式一樣,知道你爲什麽使用它,學習使用它跟別的開發者溝通是很重要的。  Decorator模式,即Wrapper模式,其強制控制作用是在不改動一個類的...查看完整版>>使用Decorator模式添加功能
 
使用Decorator模式翻譯者:Disneytiger
  使用Decorator模式  Java程序員知道可以通過擴展一個類來改變類的行爲和擴展一個類的功能。這個行爲被稱爲繼承,它是面向對象編程的一個重要的特性.  舉例來說,如果你想得到一個帶有邊框的Swing類型標簽,你可...查看完整版>>使用Decorator模式翻譯者:Disneytiger
 
設計模式之Decorator(油漆工)
裝飾模式:Decorator常被翻譯成"裝飾",我覺得翻譯成"油漆工"更形象點,油漆工(decorator)是用來刷油漆的,那麽被刷油漆的對象我們稱decoratee.這兩種實體在Decorator模式中是必須的.Decorator定義:動態給一個對象添加一...查看完整版>>設計模式之Decorator(油漆工)
 
 
回到王朝網路移動版首頁