Java IO 包中的Decorator模式

Java IO 包中的Decorator模式

ID:40199675

大?。?8.68 KB

頁數(shù):8頁

時間:2019-07-25

Java IO 包中的Decorator模式_第1頁
Java IO 包中的Decorator模式_第2頁
Java IO 包中的Decorator模式_第3頁
Java IO 包中的Decorator模式_第4頁
Java IO 包中的Decorator模式_第5頁
資源描述:

《Java IO 包中的Decorator模式》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、JavaIO包中的Decorator模式JDK為程序員提供了大量的類庫,而為了保持類庫的可重用性,可擴展性和靈活性,其中使用到了大量的設(shè)計模式,本文將介紹JDK的I/O包中使用到的Decorator模式,并運用此模式,實現(xiàn)一個新的輸出流  JDK為程序員提供了大量的類庫,而為了保持類庫的可重用性,可擴展性和靈活性,其中使用到了大量的設(shè)計模式,本文將介紹JDK的I/O包中使用到的Decorator模式,并運用此模式,實現(xiàn)一個新的輸出流類?! ecorator模式簡介Decorator模式又名包裝器(Wrap

2、per),它的主要用途在于給一個對象動態(tài)的添加一些額外的職責(zé)。與生成子類相比,它更具有靈活性。有時候,我們需要為一個對象而不是整個類添加一些新的功能,比如,給一個文本區(qū)添加一個滾動條的功能。我們可以使用繼承機制來實現(xiàn)這一功能,但是這種方法不夠靈活,我們無法控制文本區(qū)加滾動條的方式和時機。而且當(dāng)文本區(qū)需要添加更多的功能時,比如邊框等,需要創(chuàng)建新的類,而當(dāng)需要組合使用這些功能時無疑將會引起類的爆炸。我們可以使用一種更為靈活的方法,就是把文本區(qū)嵌入到滾動條中。而這個滾動條的類就相當(dāng)于對文本區(qū)的一個裝飾。這個裝飾(

3、滾動條)必須與被裝飾的組件(文本區(qū))繼承自同一個接口,這樣,用戶就不必關(guān)心裝飾的實現(xiàn),因為這對他們來說是透明的。裝飾會將用戶的請求轉(zhuǎn)發(fā)給相應(yīng)的組件(即調(diào)用相關(guān)的方法),并可能在轉(zhuǎn)發(fā)的前后做一些額外的動作(如添加滾動條)。通過這種方法,我們可以根據(jù)組合對文本區(qū)嵌套不同的裝飾,從而添加任意多的功能。這種動態(tài)的對對象添加功能的方法不會引起類的爆炸,也具有了更多的靈活性。以上的方法就是Decorator模式,它通過給對象添加裝飾來動態(tài)的添加新的功能。如下是Decorator模式的UML圖:Component為組件和

4、裝飾的公共父類,它定義了子類必須實現(xiàn)的方法。ConcreteComponent是一個具體的組件類,可以通過給它添加裝飾來增加新的功能。Decorator是所有裝飾的公共父類,它定義了所有裝飾必須實現(xiàn)的方法,同時,它還保存了一個對于Component的引用,以便將用戶的請求轉(zhuǎn)發(fā)給Component,并可能在轉(zhuǎn)發(fā)請求前后執(zhí)行一些附加的動作。ConcreteDecoratorA和ConcreteDecoratorB是具體的裝飾,可以使用它們來裝飾具體的Component?! avaIO包中的Decorator模

5、式JDK提供的java.io包中使用了Decorator模式來實現(xiàn)對各種輸入輸出流的封裝。以下將以java.io.OutputStream及其子類為例,討論一下Decorator模式在IO中的使用。首先來看一段用來創(chuàng)建IO流的代碼:以下是代碼片段:try{OutputStreamout=newDataOutputStream(newFileOutputStream("test.txt"));}catch(FileNotFoundExceptione){e.printStackTrace();}  這段代碼對

6、于使用過JAVA輸入輸出流的人來說再熟悉不過了,我們使用DataOutputStream封裝了一個FileOutputStream。這是一個典型的Decorator模式的使用,F(xiàn)ileOutputStream相當(dāng)于Component,DataOutputStream就是一個Decorator。將代碼改成如下,將會更容易理解:以下是代碼片段:try{OutputStreamout=newFileOutputStream("test.txt");out=newDataOutputStream(out);}cat

7、ch(FileNotFoundExceptione){e.printStatckTrace();}  由于FileOutputStream和DataOutputStream有公共的父類OutputStream,因此對對象的裝飾對于用戶來說幾乎是透明的。下面就來看看OutputStream及其子類是如何構(gòu)成Decorator模式的:  OutputStream是一個抽象類,它是所有輸出流的公共父類,其源代碼如下:以下是代碼片段:publicabstractclassOutputStreamimplements

8、Closeable,Flushable{publicabstractvoidwrite(intb)throwsIOException;...}  它定義了write(intb)的抽象方法。這相當(dāng)于Decorator模式中的Component類?! yteArrayOutputStream,F(xiàn)ileOutputStream和PipedOutputStream三個類都直接從OutputStream繼承,以ByteA

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。