1. 程式人生 > >JDK中的裝飾模式:Java I/O

JDK中的裝飾模式:Java I/O

Java I/O使用裝飾模式設計:

FilterInputStream為裝飾模式中的Decorator,FilterInputStream是一個普通的Java類,不是介面也不是抽象類

public class FilterInputStreamextends InputStream{
	protected  InputStream in;
	
	protected  FilterInputStream(InputStream in){
		this.in = in;
	}  	
	...
}

在InputStream提供的基本方法的基礎上,FilterInputStream的子類提供了更多附加功能,例如:

BufferedInputStream類會提供一個內部的位元組陣列作為輸入快取

通過DataInputStream類,可以用與機器無關的方式從底層資料流中讀取基本Java資料型別

LineNumberInputStream類可以跟蹤當前行號

一個提供輸入快取、並且能夠獲取輸入檔案流行數的小程式:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.LineNumberInputStream;

public class Test {
	public static void main(String[] args) {
		try {
			InputStream in = new FileInputStream(new File("c:\\seanApp\\test.txt"));
			BufferedInputStream in1 = new BufferedInputStream(in);
			LineNumberInputStream in2 = new LineNumberInputStream(in1);

			int result = in2.read();
			while(result != '\n'){
				result = in2.read();
			}
			System.out.println(in2.getLineNumber());//2
			in2.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

當然也可以通過繼承FilterInputStream類來實現自己的裝飾者:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;

//We can read the string directly by this class
public class MyInputStream extends FilterInputStream {
	protected MyInputStream(InputStream in) {
		super(in);
	}

	public int read(String str) throws IOException {
		byte[] bs = str.getBytes();
		return super.read(bs);
	}
	
	public static void main(String[] args){
		try {
			InputStream in = new FileInputStream(new File("c:\\seanApp\\test.txt"));
			BufferedInputStream in2 = new BufferedInputStream(in);
			MyInputStream in3 = new MyInputStream(in2);
			
			in3.read("Just a test!!!");
			in3.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

JDK中還有很多類是使用裝飾模式設計的,如:Reader類、Writer類、OutputStream類等,如果使用這種結構,那麼在基礎方法上新增新的功能將十分簡單

例如:java.io.Reader:

FilterReader是一個抽象類,可以很方便的進行擴充套件