装饰器模式

其中IO流是最经典的装饰器模式的使用

利用装饰器模式自己实现读取文本

public class MyBufferReader extends Reader{
	
	private Reader in;
	
	public MyBufferReader(Reader reader) {
		this.in = reader;
	}

	@Override
	public int read(char[] cbuf, int off, int len) throws IOException {
		return 0;
	}

	@Override
	public void close() throws IOException {
		in.close();
	}
	
	public String readWithLine() throws Exception{
		StringBuilder sb = new StringBuilder();
		int i;
		while(true){
			i = in.read();
			if(i == '\r'){
				continue;
			}
			if(i == '\n' || i == -1){
				break;
			}
			sb.append((char)i);
		}
		if(sb.toString().length() == 0){
			if(i == '\n'){
				return "";
			}else{
				return null;
			}
		}
//		return (count ++) + "_" + sb.toString();
		return sb.toString();
	}
	
	public static void main(String[] args) throws Exception {
		
		//这是重写的方法
		Reader reader = new FileReader("D:/1.txt");
		MyBufferReader br = new MyBufferReader(reader);
		String line;
		while((line = br.readWithLine()) != null){
			System.out.println(line);
		}
		br.close();
		//这是原生的方法
//		Reader reader = new FileReader("D:/1.txt");
//		BufferedReader br = new BufferedReader(reader);
//		String line;
//		while((line = br.readLine()) != null){
//			System.out.println(line);
//		}
//		br.close();
	}
}

image

利用装饰器模式自己实现读取文本(带行号)

原生行号的类是LineNumberReader

public class MyLineNumberReader extends MyBufferReader{

	private int lineNumber;
	
	public MyLineNumberReader(Reader reader) {
		super(reader);
	}
	
	public int getLineNumber() {
		return lineNumber;
	}

	@Override
	public String readWithLine() throws Exception {
		String line = super.readWithLine();
		if(null != line){
			lineNumber ++;
		}
		return line;
	}
	
	public static void main(String[] args) throws Exception {
		//这是重写的方法
		Reader reader = new FileReader("D:/1.txt");
		MyLineNumberReader br = new MyLineNumberReader(reader);
		String line;
		while((line = br.readWithLine()) != null){
			System.out.println(br.getLineNumber() + ":" + line);
		}
		br.close();
	}
}

image

posted @ 2021-06-08 11:10  卡卡罗特琪琪  阅读(39)  评论(0编辑  收藏  举报