(IO)装饰设计模式

 

装饰:底层仍然使用原始的功能,但是对外提供封装好的增强的功能!

 

package com.gc.file;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
/**
 * 使用字符缓冲区对Reader进行装饰---提高读取速度
 * 每次读取磁盘时,读一批数据到字符数组(缓冲区)中
 * 外界取得时候直接从缓冲区中获取数据,因此速度快!
 *
 */
public class MyBufferedReader {
	
	private Reader reader;//底层仍然用Reader的方法,但是对外提供了增强的读取功能
	
	public MyBufferedReader(Reader reader) {
		this.reader = reader;
	}
	
	private char[] cbuf = new char[1024];//字符缓冲区
	
	private int pos = 0;//记录读取位置
	
	private int count = 0;//记录总数
	
	public int myRead() throws IOException {
		if(count==0) {
			//往字符缓冲区读,底层用到的仍然是Reader的read()
			count = reader.read(cbuf);
			//从新读取后,指针归0
			pos = 0;
		}
		if(count<0)
			return -1;
		count--;
		//返回的时候直接操作缓冲区,而不是去磁盘读1个返回1个,提高了效率---装饰:本质不变,但增强了功能(提高读取速度)
		char ch = cbuf[pos++];
		return ch;
	}
	
	public static void main(String[] args) throws IOException {
		MyBufferedReader myReader = new MyBufferedReader(new FileReader("temp\\text.txt"));
		int ch = 0;
		while((ch=myReader.myRead())!=-1) {
			System.out.print((char)ch);
		}
	}
}

 

 

层层包装---装饰

(将底层功能进行了隐藏)

不管怎么装饰,仍离不开原始的功能

基于原始功能再进行扩展对外暴露的则是扩展后的功能


(IO)装饰设计模式