JDK中的裝飾模式:Java I/O
阿新 • • 發佈:2019-02-18
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是一個抽象類,可以很方便的進行擴充套件