資源描述:
《Java IO 包中的Decorator模式》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、JavaIO包中的Decorator模式JDK為程序員提供了大量的類庫,而為了保持類庫的可重用性,可擴(kuò)展性和靈活性,其中使用到了大量的設(shè)計(jì)模式,本文將介紹JDK的I/O包中使用到的Decorator模式,并運(yùn)用此模式,實(shí)現(xiàn)一個(gè)新的輸出流 JDK為程序員提供了大量的類庫,而為了保持類庫的可重用性,可擴(kuò)展性和靈活性,其中使用到了大量的設(shè)計(jì)模式,本文將介紹JDK的I/O包中使用到的Decorator模式,并運(yùn)用此模式,實(shí)現(xiàn)一個(gè)新的輸出流類。 Decorator模式簡介Decorator模式又名包裝器(Wrap
2、per),它的主要用途在于給一個(gè)對象動態(tài)的添加一些額外的職責(zé)。與生成子類相比,它更具有靈活性。有時(shí)候,我們需要為一個(gè)對象而不是整個(gè)類添加一些新的功能,比如,給一個(gè)文本區(qū)添加一個(gè)滾動條的功能。我們可以使用繼承機(jī)制來實(shí)現(xiàn)這一功能,但是這種方法不夠靈活,我們無法控制文本區(qū)加滾動條的方式和時(shí)機(jī)。而且當(dāng)文本區(qū)需要添加更多的功能時(shí),比如邊框等,需要創(chuàng)建新的類,而當(dāng)需要組合使用這些功能時(shí)無疑將會引起類的爆炸。我們可以使用一種更為靈活的方法,就是把文本區(qū)嵌入到滾動條中。而這個(gè)滾動條的類就相當(dāng)于對文本區(qū)的一個(gè)裝飾。這個(gè)裝飾(
3、滾動條)必須與被裝飾的組件(文本區(qū))繼承自同一個(gè)接口,這樣,用戶就不必關(guān)心裝飾的實(shí)現(xiàn),因?yàn)檫@對他們來說是透明的。裝飾會將用戶的請求轉(zhuǎn)發(fā)給相應(yīng)的組件(即調(diào)用相關(guān)的方法),并可能在轉(zhuǎn)發(fā)的前后做一些額外的動作(如添加滾動條)。通過這種方法,我們可以根據(jù)組合對文本區(qū)嵌套不同的裝飾,從而添加任意多的功能。這種動態(tài)的對對象添加功能的方法不會引起類的爆炸,也具有了更多的靈活性。以上的方法就是Decorator模式,它通過給對象添加裝飾來動態(tài)的添加新的功能。如下是Decorator模式的UML圖:Component為組件和
4、裝飾的公共父類,它定義了子類必須實(shí)現(xiàn)的方法。ConcreteComponent是一個(gè)具體的組件類,可以通過給它添加裝飾來增加新的功能。Decorator是所有裝飾的公共父類,它定義了所有裝飾必須實(shí)現(xiàn)的方法,同時(shí),它還保存了一個(gè)對于Component的引用,以便將用戶的請求轉(zhuǎn)發(fā)給Component,并可能在轉(zhuǎn)發(fā)請求前后執(zhí)行一些附加的動作。ConcreteDecoratorA和ConcreteDecoratorB是具體的裝飾,可以使用它們來裝飾具體的Component?! avaIO包中的Decorator模
5、式JDK提供的java.io包中使用了Decorator模式來實(shí)現(xiàn)對各種輸入輸出流的封裝。以下將以java.io.OutputStream及其子類為例,討論一下Decorator模式在IO中的使用。首先來看一段用來創(chuàng)建IO流的代碼:以下是代碼片段:try{OutputStreamout=newDataOutputStream(newFileOutputStream("test.txt"));}catch(FileNotFoundExceptione){e.printStackTrace();} 這段代碼對
6、于使用過JAVA輸入輸出流的人來說再熟悉不過了,我們使用DataOutputStream封裝了一個(gè)FileOutputStream。這是一個(gè)典型的Decorator模式的使用,F(xiàn)ileOutputStream相當(dāng)于Component,DataOutputStream就是一個(gè)Decorator。將代碼改成如下,將會更容易理解:以下是代碼片段:try{OutputStreamout=newFileOutputStream("test.txt");out=newDataOutputStream(out);}cat
7、ch(FileNotFoundExceptione){e.printStatckTrace();} 由于FileOutputStream和DataOutputStream有公共的父類OutputStream,因此對對象的裝飾對于用戶來說幾乎是透明的。下面就來看看OutputStream及其子類是如何構(gòu)成Decorator模式的: OutputStream是一個(gè)抽象類,它是所有輸出流的公共父類,其源代碼如下:以下是代碼片段:publicabstractclassOutputStreamimplements
8、Closeable,Flushable{publicabstractvoidwrite(intb)throwsIOException;...} 它定義了write(intb)的抽象方法。這相當(dāng)于Decorator模式中的Component類?! yteArrayOutputStream,F(xiàn)ileOutputStream和PipedOutputStream三個(gè)類都直接從OutputStream繼承,以ByteA