在JAVA I/O類庫裏有不少不一樣的功能組合狀況,這些不一樣的功能組合都是使用裝飾器模式實現的,下面以FilterInputStream爲例介紹裝飾器模式的使用html
FilterInputStream和FilterOutputStreamjava
首先,這兩個都分別是InputStream和OutputStream的子類。並且,FilterInputStream和FilterOutputStream是具體的子類,實現了InputStream和OutputStream這兩個抽象類中爲給出實現的方法。數組
可是,FilterInputStream和FilterOutputStream僅僅是「裝飾者模式」封裝的開始,它們在各個方法中的實現都是最基本的實現,都是基於構造方法中傳入參數封裝的InputStream和OutputStream的原始對象。htm
BufferedInputStream/BufferedOutputStream對象
先說說這個最簡單的一對,BufferedInputStream和BufferedOutputStream。顧名思義,Buffered就是緩衝了的。在BufferedInputStream和BufferedOutputStream中,都額外實現了byte數組作buffer。blog
咱們知道在父類FilterInputStream和FilterOutputStream類中,已經在構造方法時封裝了原始的InputStream或者OutputStream對象。接口
在咱們使用BufferedInputStream和BufferedOutputStream來進行read()和write()調用的時候,並不必定直接對封裝的InputStream或者OutputStream對象進行操做,而是要通過緩衝處理。it
在BufferedInputStream的read()中,其實是一次讀取了多個字節到緩衝數組,而非一次只讀取一個。後續的read()操做能夠直接從數組中獲取字節,而沒必要再次調用封裝的InputStream對象的read()操做。這樣作其實在必定狀況下能夠減小底層的read調用次數,下降成本開銷,提升了效率。效率
在BufferedOutputStream中也是同樣,它的write()會先把數據寫到緩衝數組中,直到數據達到了某個特定的限額,再調用write()的時候回真正調用到封裝的OutputStream對象的write()方法。方法
而DataInputStream/DataOutputStream這一對實際上所作的也就是這兩個接口所定義的方法。再DataInputStream/DataOutputStream中,這些方法作了拼接和拆分字節的工做。經過這些方法,咱們能夠方便的讀取、寫出各類咱們實際所面對的類型的數據,而沒必要具體去在字節層面上作細節操做。
原文連接http://www.cnblogs.com/java-my-life/archive/2012/04/20/2455726.html