前言
最近在學習IO 這塊内容,結合經典的裝飾模式,說下IO庫中展現的設計模式。
正文
節點流和處理流
Java 中的流按照流的流向來分,可以分為輸入流和輸出流;按照流的角色分,可以分為節點流(低級流)和處理流(進階流),節點流是指 程式直接連到實際的資料源,和實際的輸入、輸出節點連接配接;處理流是對一個已經存在的流進行連接配接和封裝,實際上是用處理流來包裝節點流,既可以消除不同節點流的實作差異,也可以提供更友善的方法來完成輸入/輸出功能。是以處理流也被稱為包裝流。
Java 使用節點流來包裝節點流是一種典型的裝飾器設計模式。
Java IO 的結構介紹
對應的UML模型:
源碼實作
/*****************InputStream類(抽象元件)***************/
package java.io;
public abstract class InputStream implements Closeable {
// MAX_SKIP_BUFFER_SIZE is used to determine the maximum buffer size to
// use when skipping.
private static final int MAX_SKIP_BUFFER_SIZE = ;
//……
public abstract int read() throws IOException;
}
/*****************FilterInputStream類(抽象裝飾者)***************/
package java.io;
public
class FilterInputStream extends InputStream {
/**
* The input stream to be filtered.
*/
protected volatile InputStream in;
//将抽象元件作為參數放在構造函數中,接受一個抽象元件對象
protected FilterInputStream(InputStream in) {
this.in = in;
}
}
/*****************BufferedInputStream類(具體裝飾者一)***************/
package java.io;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
public class BufferedInputStream extends FilterInputStream {
private static int DEFAULT_BUFFER_SIZE = ;
public BufferedInputStream(InputStream in) {
this(in, DEFAULT_BUFFER_SIZE);
}
public BufferedInputStream(InputStream in, int size) {
super(in);
if (size <= ) {
throw new IllegalArgumentException("Buffer size <= 0");
}
buf = new byte[size];
}
}
/*****************PushbackInputStream類(具體裝飾者二)***************/
package java.io;
public class PushbackInputStream extends FilterInputStream {
public PushbackInputStream(InputStream in) {
this(in, );
}
public PushbackInputStream(InputStream in, int size) {
super(in);
if (size <= ) {
throw new IllegalArgumentException("size <= 0");
}
this.buf = new byte[size];
this.pos = size;
}
}
/*****************FileInputStream類(具體元件/具體被裝飾者)***************/
package java.io;
import java.nio.channels.FileChannel;
import sun.nio.ch.FileChannelImpl;
public class FileInputStream extends InputStream
{
public int read() throws IOException {
return read0();
}
private native int read0() throws IOException;
}
說明:此處介紹的隻是java.IO包中四大等級結構InputStream 中的一種,其它體系内部也實作了裝飾者模式,有興趣的話可以對應着去看看。
總結
IO 體系中InputStream,outputStream,InputStreamReader,outputStreamReader各個體系内部用到的是裝飾者模式,而outputStream和outputStreamReader之間用的是擴充卡模式,具體内容請看下一篇部落格。