Java IO流之裝飾模式與介面卡模式講解

zhifeng687發表於2015-12-06

   在Java IO流中,我們經常使用的是位元組流與字元流,下面附上幾張圖可以很清楚的瞭解他們之間的繼承關係,圖片來源於網路,在此感謝圖片的製作者。

1、位元組流各個類的繼承關係:



2、字元流各個類個繼承關係:


一、裝飾模式解讀:

什麼是裝飾模式呢?就比如有一個瓶子,我為了讓它好看點,給它插上些花,這就起到了裝飾作用。
  在我們的日常使用開發中,經常看到這各個類的巢狀關係,如:

[java] view plain copy
  1. DataInputStream  dataInputStream = new DataInputStream(new FileInputStream(new File("text.txt")));  
[java] view plain copy
  1. DataInputStream  dataInputStream = new DataInputStream(new FileInputStream(new File("text.txt")));  
 
其中DataInputStream給FileInputStream起到包裝作用。到這裡,或許有人疑惑了,我怎麼知道它是不是給它起到了包裝作用,在這裡大家可以看上面的位元組流圖FilterInputStream和FilterOutputStream以及他們的子類,由於這連個類是抽象類,所以我們是使用他們的子類的。這裡大家可以看如下的幾個類的構造方法的引數型別:

  BufferedInputStream /BufferedOutputStream 
[java] view plain copy
  1. BufferedInputStream(InputStream in)  
  2. BufferedOutputStream(OutputStream out)  
[java] view plain copy
  1. BufferedInputStream(InputStream in)  
  2. BufferedOutputStream(OutputStream out)  
DataInputStream / DataOutStream:
[java] view plain copy
  1. DataInputStream(InputStream in)   
  2. DataOutputStream(OutputStream out)  
[java] view plain copy
  1. DataInputStream(InputStream in)   
  2. DataOutputStream(OutputStream out)  
他們的引數都是要InputStream / OutputStream 的子類,那再來看看InputStream或OutputStream直接子類,而不是FilterInputStream或FilterOutputStream的子類:
[java] view plain copy
  1. ByteArrayInputStream(byte[] buf)   
  2. FileInputStream(File file)   
[java] view plain copy
  1. ByteArrayInputStream(byte[] buf)   
  2. FileInputStream(File file)   
可以看到它們的引數型別是位元組或檔案型別,所以它們是作為原資料,是可以被包裝的。
在這裡相信大家對Java的IO流裝飾模式有了一定的瞭解,主要就是:1、有原資料、可以被包裝的。2、包裝類,能包裝其他事物的,就是在原事物上新增點東西。

二、介面卡模式

什麼是介面卡模式呢,相信大家都會想到膝上型電腦的電源就是個介面卡吧,不管它外部有多少伏電壓過來,只要經過了介面卡就能轉變成我電腦需要的伏數,其中介面卡起到了橋樑作用。就比如在生活中兩個人吵架,要他們和解,那肯定是需要第三者來調解吧。
那好,我們迴歸正題,Java IO流的介面卡模式又是怎樣的呢? 我們都知道IO流有字元和位元組流,那怎樣把位元組流轉換成字元流來使用的呢?這其中就是要使用到介面卡類了,如圖:
在這其中InputStreamReader和OutputStreamWriter就在位元組流與字元流中起到了橋樑作用, 如:
[java] view plain copy
  1. BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("text.txt"))));  
[java] view plain copy
  1. BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("text.txt"))));  

其中就可以把位元組原資料當字元來讀取了,因為InputStreamReader已經幫我們轉換了。

最後相信大家對Java IO流模式的使用有些瞭解,確切滴說原來我們平常這樣寫法是使用到了這種模式啊!
當然以上這兩種模式是比較常見的,在Java中有23種設計模式,每種模式都有它的奧妙之處,作為一名Java程式設計師,不瞭解Java設計模式還真說不過去,當然本人也在不斷領會中~~

Java23中設計模式:點此連結下載

相關文章