天天看點

【IO】- IO 體系中的設計模式-裝飾模式前言正文總結

前言

     最近在學習IO 這塊内容,結合經典的裝飾模式,說下IO庫中展現的設計模式。

正文

節點流和處理流

    Java 中的流按照流的流向來分,可以分為輸入流和輸出流;按照流的角色分,可以分為節點流(低級流)和處理流(進階流),節點流是指 程式直接連到實際的資料源,和實際的輸入、輸出節點連接配接;處理流是對一個已經存在的流進行連接配接和封裝,實際上是用處理流來包裝節點流,既可以消除不同節點流的實作差異,也可以提供更友善的方法來完成輸入/輸出功能。是以處理流也被稱為包裝流。

    Java 使用節點流來包裝節點流是一種典型的裝飾器設計模式。

【IO】- IO 體系中的設計模式-裝飾模式前言正文總結

Java IO 的結構介紹

【IO】- IO 體系中的設計模式-裝飾模式前言正文總結

    對應的UML模型:

【IO】- IO 體系中的設計模式-裝飾模式前言正文總結

源碼實作

/*****************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之間用的是擴充卡模式,具體内容請看下一篇部落格。

繼續閱讀