資源描述:
《IO庫(kù)設(shè)計(jì)模式》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、JavaI/O庫(kù)的兩個(gè)設(shè)計(jì)模式:Java的I/O庫(kù)總體設(shè)計(jì)是符合裝飾者模式(Decorator)跟適配器模式(Adapter)的。FileInputStream,F(xiàn)ileOutputStream,DataInputStream及DataOutputStream都是流處理器的例子。?1 裝飾者模式:在由InputStream,OutputStream,Reader和Writer代表的等級(jí)結(jié)構(gòu)內(nèi)部,有一些流處理器可以對(duì)另一些流處理器起到裝飾作用,形成新的,具有改善了的功能的流處理器。裝飾者模式是JavaI/O庫(kù)的整體設(shè)計(jì)模式。這樣的一個(gè)原則是符合裝飾者模式的,如下圖
2、所示:2 適配器模式:在由InputStream,OutputStream,Reader和Writer代表的等級(jí)結(jié)構(gòu)內(nèi)部,有一些流處理器是對(duì)其它類型的流源的適配。這就是適配器模式的應(yīng)用,如下圖所示?! ∵m配器模式應(yīng)用到了原始流處理器的設(shè)計(jì)上面,構(gòu)成了I/O庫(kù)所有流處理器的起點(diǎn)。??三 裝飾模式的應(yīng)用? 為什么不用繼承而用裝飾模式 JavaI/O庫(kù)需要很多性能的各種組合,如果說(shuō)這些性能的組合是通過(guò)繼承方式來(lái)實(shí)現(xiàn)的話,那么每一種組合都需要一個(gè)類,這樣就會(huì)出現(xiàn)大量重復(fù)性問(wèn)題的出現(xiàn),從而使類數(shù)目“爆炸”。而如果采用裝飾模式,那么不僅類的數(shù)目大減少了,性能的重復(fù)也可以減
3、至到最少。所以裝飾模式是JavaI/O庫(kù)的基本模式?!∮捎谘b飾模式的引用,造成了靈活性和復(fù)雜都大大增加了,必須理解JavaI/O庫(kù)是由一些基本的原始流處理器和圍繞它們的裝飾流處理器所組成的,這樣可以在學(xué)習(xí)和使用JavaI/O庫(kù)時(shí)達(dá)到事半功倍的效果?!? 首先是InputStream類型中的裝飾模式: InputStream有七個(gè)直接的具體子類,有四個(gè)屬于FilterInputStream的具體子類,如下圖所示: 上圖中所有的類都叫做流處理器,這個(gè)圖就叫做(InputStream類型的)流處理器圖?! 「鶕?jù)輸入流的源的類型,可以將這些流類分成兩種,即原始流類(O
4、riginalStream)和鏈接流處理器(WrapperStream)。? 原始流處理器 原始流處理器接收一個(gè)Byte數(shù)組對(duì)象,String對(duì)象,F(xiàn)ileDiscriptor對(duì)象或者不同類型的流源對(duì)象,根據(jù)上面的圖,原始流處理器包括以下四種: ByteArrayInputStream:為多線程的通信提供緩沖區(qū)操作功能,接收一個(gè)Byte數(shù)組作為流的源?! ileInputStream:建立一個(gè)與文件有關(guān)的輸入流。接收一個(gè)File對(duì)象作為流的源。 PipedInputStream:可以與PipedOutputStream配合使用,用于讀入一個(gè)數(shù)據(jù)管道的數(shù)
5、據(jù),接收一個(gè)PipedOutputStream作為源?! tringBufferInputStream:將一個(gè)字符串緩沖區(qū)轉(zhuǎn)換為一個(gè)輸入流。接收一個(gè)String對(duì)象作為流的源。(JDK幫助文檔上說(shuō)明:已過(guò)時(shí)。此類未能正確地將字符轉(zhuǎn)換為字節(jié)。從JDK1.1開(kāi)始,從字符串創(chuàng)建流的首選方法是通過(guò)StringReader類進(jìn)行創(chuàng)建。只有字符串中每個(gè)字符的低八位可以由此類使用。)?鏈接流處理器 所謂鏈接流處理器,就是可以接收另一個(gè)流對(duì)象作為源,并對(duì)之進(jìn)行功能擴(kuò)展的類。InputStream類型的鏈接處理器包括以下幾種,它們都接收另一個(gè)InputStream對(duì)象作為流源
6、?! 。ǎ保〧ilterInputStream稱為過(guò)濾輸入流,它將另一個(gè)輸入流作為流源。這個(gè)類的子類包括以下幾種: BufferedInputStream:用來(lái)從硬盤將數(shù)據(jù)讀入到一個(gè)內(nèi)存緩沖區(qū)中,并從緩沖區(qū)提供數(shù)據(jù)?! ataInputStream:提供基于多字節(jié)的讀取方法,可以讀取原始類型的數(shù)據(jù)。 LineNumberInputStream:提供帶有行計(jì)數(shù)功能的過(guò)濾輸入流?! ushbackInputStream:提供特殊的功能,可以將已經(jīng)讀取的字節(jié)“推回”到輸入流中。 ?。ǎ玻㎡bjectInputStream可以將使用ObjectInputStre
7、am串行化的原始數(shù)據(jù)類型和對(duì)象重新并行化?! 。ǎ常㏒eqcueneInputStream可以將兩個(gè)已有的輸入流連接起來(lái),形成一個(gè)輸入流,從而將多個(gè)輸入流排列構(gòu)成一個(gè)輸入流序列?! 〕橄蠼Y(jié)構(gòu)圖 按照上面的這種原始流處理器和鏈接流處理器的劃分,可以用下面的結(jié)構(gòu)圖來(lái)描述它們之間的關(guān)系?! ? 上面的流處理器圖跟裝飾模式的結(jié)構(gòu)圖有著顯而易見(jiàn)的相同之處。實(shí)際上InputStream類型的流處理器結(jié)構(gòu)確實(shí)符合裝飾模式?! ⊙b飾模式結(jié)構(gòu)圖 對(duì)于上圖FilterInputStream查看JDK1.6源代碼,部分代碼如下:Java代碼??1.public?class?Fi
8、lterInputStr