亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

JavaI/O包中的Decorator模式介紹

2019-11-18 11:12:49
字體:
來源:轉載
供稿:網友

  JDK為程序員提供了大量的類庫,而為了保持類庫的可重用性,可擴展性和靈活性,其中使用到了大量的設計模式,本文將介紹JDK的I/O包中使用到的Decorator模式,并運用此模式,實現一個新的輸出流類。

  Decorator模式簡介

  Decorator模式又名包裝器(Wrapper),它的主要用途在于給一個對象動態的添加一些額外的職責。與生成子類相比,它更具有靈活性。
有時候,我們需要為一個對象而不是整個類添加一些新的功能,比如,給一個文本區添加一個滾動條的功能。我們可以使用繼續機制來實現這一功能,但是這種方法不夠靈活,我們無法控制文本區加滾動條的方式和時機。而且當文本區需要添加更多的功能時,比如邊框等,需要創建新的類,而當需要組合使用這些功能時無疑將會引起類的爆炸。

  我們可以使用一種更為靈活的方法,就是把文本區嵌入到滾動條中。而這個滾動條的類就相當于對文本區的一個裝飾。這個裝飾(滾動條)必須與被裝飾的組件(文本區)繼續自同一個接口,這樣,用戶就不必關心裝飾的實現,因為這對他們來說是透明的。裝飾會將用戶的請求轉發給相應的組件(即調用相關的方法),并可能在轉發的前后做一些額外的動作(如添加滾動條)。通過這種方法,我們可以根據組合對文本區嵌套不同的裝飾,從而添加任意多的功能。這種動態的對對象添加功能的方法不會引起類的爆炸,也具有了更多的靈活性。

  以上的方法就是Decorator模式,它通過給對象添加裝飾來動態的添加新的功能。如下是Decorator模式的UML圖:

JavaI/O包中的Decorator模式介紹(圖一)


  Component為組件和裝飾的公共父類,它定義了子類必須實現的方法。

  ConcreteComponent是一個具體的組件類,可以通過給它添加裝飾來增加新的功能。

  Decorator是所有裝飾的公共父類,它定義了所有裝飾必須實現的方法,同時,它還保存了一個對于Component的引用,以便將用戶的請求轉發給Component,并可能在轉發請求前后執行一些附加的動作。

  ConcreteDecoratorA和ConcreteDecoratorB是具體的裝飾,可以使用它們來裝飾具體的Component。

  java IO包中的Decorator模式

  JDK提供的java.io包中使用了Decorator模式來實現對各種輸入輸出流的封裝。以下將以java.io.OutputStream及其子類為例,討論一下Decorator模式在IO中的使用。

  首先來看一段用來創建IO流的代碼:

  以下是代碼片段:
try {
 OutputStream out = new DataOutputStream(new FileOutputStream("test.txt"));
} catch (FileNotFoundException e) {
 e.PRintStackTrace();
}

  這段代碼對于使用過JAVA輸入輸出流的人來說再熟悉不過了,我們使用DataOutputStream封裝了一個FileOutputStream。這是一個典型的Decorator模式的使用,FileOutputStream相當于Component,DataOutputStream就是一個Decorator。將代碼改成如下,將會更輕易理解:

  以下是代碼片段:
try {
 OutputStream out = new FileOutputStream("test.txt");
 out = new DataOutputStream(out);
} catch(FileNotFoundException e) {
 e.printStatckTrace();
}

  由于FileOutputStream和DataOutputStream有公共的父類OutputStream,因此對對象的裝飾對于用戶來說幾乎是透明的。下面就來看看OutputStream及其子類是如何構成Decorator模式的:

JavaI/O包中的Decorator模式介紹(圖二)


  OutputStream是一個抽象類,它是所有輸出流的公共父類,其源代碼如下:

  以下是代碼片段:
public abstract class OutputStream implements Closeable, Flushable {
public abstract void write(int b) throws IOException;
...
}

  它定義了write(int b)的抽象方法。這相當于Decorator模式中的Component類。

  ByteArrayOutputStream,FileOutputStream 和 PipedOutputStream 三個類都直接從OutputStream繼續,以ByteArrayOutputStream為例:

  以下是代碼片段:
public class ByteArrayOutputStream extends OutputStream {
protected byte buf[];
protected int count;
public ByteArrayOutputStream() {
this(32);
}
public ByteArrayOutputStream(int size) {
if (size 〈 0) {
throw new IllegalArgumentException("Negative initial size: " + size);
}
buf = new byte[size];
}
public synchronized void write(int b) {
int newcount = count + 1;
if (newcount 〉 buf.length) {
byte newbuf[] = new byte[Math.max(buf.length 〈〈 1, newcount)];
System.arraycopy(buf, 0, newbuf, 0, count);
buf = newbuf;
}
buf[count] = (byte)b;
count = newcount;
}
...
}

  它實現了OutputStream中的write(int b)方法,因此我們可以用來創建輸出流的對象,并完成特定格式的輸出。它相當于Decorator模式中的ConcreteComponent類。

  接著來看一下FilterOutputStream,代碼如下:

以下是代碼片段:
public class FilterOutputStream extends OutputStream {
protected OutputStream out;
public FilterOutputStream(OutputStream out) {
this.out = out;
}
public void write(int b) throws IOException {
out.write(b);
}
...
}

  同樣,它也是從OutputStream繼續。但是,它的構造函數很非凡,需要傳遞一個OutputStream的引用給它,并且它將保存對此對象的引用。而假如沒有具體的OutputStream對象存在,我們將無法創建FilterOutputStream。由于out既可以是指向FilterOutputStream類型的引用,也可以是指向ByteArrayOutputStream等具體輸出流類的引用,因此使用多層嵌套的方式,我們可以為ByteArrayOutputStream添加多種裝飾。這個FilterOutputStream類相當于Decorator模式中的Decorator類,它的write(int b)方法只是簡單的調用了傳入的流的write(int b)方法,而沒有做更多的處理,因此它本質上沒有對流進行裝飾,所以繼續它的子類必須覆蓋此方法,以達到裝飾的目的。

  BufferedOutputStream 和 DataOutputStream是FilterOutputStream的兩個子類,它們相當于Decorator模式中的ConcreteDecorator,并對傳入的輸出流做了不同的裝飾。以BufferedOutputStream類為例:

  以下是代碼片段:
public class BufferedOutputStream extends FilterOutputStream {
...
private void flushBuffer() throws IOException {
if (count 〉 0) {
out.write(buf, 0, count);
count = 0;
}
}
public synchronized void write(int b) throws IOException {
if (count 〉= buf.length) {
flushBuffer();
}
buf[count++] = (byte)b;
}
...
}

  這個類提供了一個緩存機制,等到緩存的容量達到一定的字節數時才寫入輸出流。首先它繼續了FilterOutputStream,并且覆蓋了父類的write(int b)方法,在調用輸出流寫出數據前都會檢查緩存是否已滿,假如未滿,則不寫。這樣就實現了對輸出流對象動態的添加新功能的目的。

  下面,將使用Decorator模式,為IO寫一個新的輸出流。

  自己寫一個新的輸出流

  了解了OutputStream及其子類的結構原理后,我們可以寫一個新的輸出流,來添加新的功能。這部分中將給出一個新的輸出流的例子,它將過濾待輸出語句中的空格符號。比如需要輸出"java io OutputStream",則過濾后的輸出為"javaioOutputStream"。以下為SkipSpaceOutputStream類的代碼:

  以下是代碼片段:
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* A new output stream, which will check the space character
* and won’t write it to the output stream.
* @author Magic
*
*/
public class SkipSpaceOutputStream extends FilterOutputStream {
 public SkipSpaceOutputStream(OutputStream out) {
  super(out);
 }
 /**
 * Rewrite the method in the parent class, and
 * skip the space character.
 */
 public void write(int b) throws IOException{
  if(b!=’ ’){
   super.write(b);
  }
 }
}

  它從FilterOutputStream繼續,并且重寫了它的write(int b)方法。在write(int b)方法中首先對輸入字符進行了檢查,假如不是空格,則輸出。

  以下是一個測試程序:

  以下是代碼片段:
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* Test the SkipSpaceOutputStream.
* @author Magic
*
*/
public class Test {
 public static void main(String[] args){
  byte[] buffer = new byte[1024];

  /**
  * Create input stream from the standard input.
  */
  InputStream in = new BufferedInputStream(new DataInputStream(System.in));

  /**
  * write to the standard output.
  */
  OutputStream out = new SkipSpaceOutputStream(new DataOutputStream(System.out));

  try {
   System.out.println("Please input your Words: ");
   int n = in.read(buffer,0,buffer.length);
   for(int i=0;i〈n;i++){
    out.write(buffer[i]);
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

  執行以上測試程序,將要求用戶在console窗口中輸入信息,程序將過濾掉信息中的空格,并將最后的結果輸出到console窗口。比如:

  以下是引用片段:
Please input your words:
a b c d e f
abcdef

  總 結

  在java.io包中,不僅OutputStream用到了Decorator設計模式,InputStream,Reader,Writer等都用到了此模式。而作為一個靈活的,可擴展的類庫,JDK中使用了大量的設計模式,比如在Swing包中的MVC模式,RMI中的Proxy模式等等。對于JDK中模式的研究不僅能加深對于模式的理解,而且還有利于更透徹的了解類庫的結構和組成。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩在线亚洲字幕中文| 91在线观看免费高清| 久久免费少妇高潮久久精品99| 高清欧美电影在线| 国产精品美女999| 亚洲国内精品视频| 久久综合亚洲社区| 亚洲欧美成人一区二区在线电影| 都市激情亚洲色图| 亚洲第一二三四五区| 国产精品一区二区电影| 伊人精品在线观看| 国产视频一区在线| 日韩精品中文字幕在线观看| www.久久撸.com| 亚洲电影中文字幕| 亚洲电影免费观看高清完整版在线观看| 国产福利视频一区二区| 国产精品国产三级国产专播精品人| 色妞色视频一区二区三区四区| 久久亚洲国产精品| 亚洲综合最新在线| 色琪琪综合男人的天堂aⅴ视频| 色婷婷**av毛片一区| 久久久久国产视频| 青青a在线精品免费观看| 伊人久久免费视频| 这里只有精品在线观看| 精品在线观看国产| 91国内免费在线视频| 91极品女神在线| 国产亚洲日本欧美韩国| 国产一区二区三区网站| 成人午夜在线影院| 久久成人人人人精品欧| 7777精品久久久久久| 欧美日韩在线观看视频小说| 欧美xxxx综合视频| 国产一区二区三区毛片| 亚洲自拍偷拍一区| 欧美性猛交xxxx偷拍洗澡| 亚洲国产精品va在线观看黑人| 欧美天天综合色影久久精品| 国产成人精品一区二区在线| 国产精品高潮粉嫩av| 国产日韩欧美日韩大片| 国内外成人免费激情在线视频网站| 亚洲欧美日韩第一区| 亚洲一区二区三区视频| 国产一区二区在线免费| 日本在线精品视频| 91免费国产视频| 97视频免费在线观看| 最近2019年好看中文字幕视频| 国内精品久久久久影院 日本资源| 国产亚洲精品日韩| 97碰在线观看| 日本19禁啪啪免费观看www| 久久久精品中文字幕| 国产精彩精品视频| 日韩在线观看免费av| 亚洲欧美日韩国产中文| 九九精品视频在线| 国产成人精品综合久久久| 在线观看精品自拍私拍| 亚洲xxxxx电影| 日韩性xxxx爱| 亚洲电影免费观看| 国内外成人免费激情在线视频网站| 欧美精品久久久久| 欧美性高潮在线| 日韩精品免费一线在线观看| 深夜福利一区二区| 欧美成人四级hd版| 亚洲精品99久久久久| 亚洲xxxxx电影| 狠狠色香婷婷久久亚洲精品| 91亚洲午夜在线| 成人国产在线激情| 国产美女精品免费电影| 日韩av不卡电影| 国产欧美精品xxxx另类| 欧洲成人午夜免费大片| 亚洲色图av在线| 日韩av片电影专区| 91久久精品国产91性色| 97人人爽人人喊人人模波多| 欧美日韩加勒比精品一区| 亚洲成人久久一区| 亚洲国产一区二区三区四区| 波霸ol色综合久久| 久久亚洲精品小早川怜子66| 国产a级全部精品| 欧美黑人视频一区| 97香蕉超级碰碰久久免费的优势| 久久久久久综合网天天| 北条麻妃一区二区在线观看| 97精品一区二区三区| 欧美日韩国产丝袜美女| 亚洲成人激情在线| 在线观看日韩av| 精品日韩美女的视频高清| 91精品国产99久久久久久| 亚洲福利视频久久| 91麻豆国产语对白在线观看| 日韩精品高清在线| 欧美疯狂做受xxxx高潮| 中文字幕免费国产精品| 2018日韩中文字幕| 久久中文字幕在线| 亚洲高清在线观看| 81精品国产乱码久久久久久| 欧美午夜女人视频在线| 亚洲精品一区二区三区婷婷月| 68精品国产免费久久久久久婷婷| 亚洲一区免费网站| 亚洲欧洲日产国码av系列天堂| 亚洲国产日韩欧美在线动漫| 美女精品视频一区| 久久亚洲精品一区二区| 国产精品美女久久久久av超清| 久久99青青精品免费观看| 亚洲人高潮女人毛茸茸| 国产精品精品视频一区二区三区| 欧美精品中文字幕一区| 91精品综合视频| 欧美视频在线观看免费| 51精品国产黑色丝袜高跟鞋| 国产深夜精品福利| 国产成一区二区| 国产成人精品日本亚洲专区61| 成人免费大片黄在线播放| 欧美天天综合色影久久精品| 夜夜嗨av色一区二区不卡| 亚洲国产高清高潮精品美女| 97超碰蝌蚪网人人做人人爽| 欧美午夜美女看片| 日本精品va在线观看| 国产亚洲精品综合一区91| 日本韩国欧美精品大片卡二| 国产精品综合不卡av| 亚洲日韩中文字幕| 国产欧美日韩免费| 国产精品一区二区三区在线播放| 日韩电视剧免费观看网站| 欧美日韩国产中文字幕| 精品久久久久久久久久久久久| 欧美精品videos性欧美| 国产精品久久久久久久久影视| 精品欧美国产一区二区三区| 欧美国产亚洲精品久久久8v| 国产亚洲日本欧美韩国| 欧美一性一乱一交一视频| 91中文精品字幕在线视频| 日韩视频一区在线| yellow中文字幕久久| 韩日欧美一区二区| 国产精品99久久久久久人| 97视频在线观看网址| 精品福利一区二区| 国产精品成人在线| 在线视频国产日韩| 亚洲成人av资源网| 亚洲人线精品午夜|