(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);
}
}
}
层层包装---装饰
(将底层功能进行了隐藏)
不管怎么装饰,仍离不开原始的功能
基于原始功能再进行扩展对外暴露的则是扩展后的功能