JDK中的装饰模式:Java I/O

来源:互联网 发布:java合并两个json对象 编辑:程序博客网 时间:2024/05/16 05:16

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());//2in2.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 classpublic 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是一个抽象类,可以很方便的进行扩展

原创粉丝点击