★ 场景和问题
在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能?
★ 引例
写一个MyBufferedReader类,使它能够对字符流(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
这里做三种类体系对比:
附例码如下:
package SingelModel.pattern.decorator.v3;
import java.io.IOException;
import java.io.Reader;
public class MyBufferedReader extends Reader { //一般使用装饰模式时,继承Reader,功能更强大
private Reader r; //封装一个对象 ※※※※
private char[] cbuf = new char[1024];
private int count=0; //记录当前缓冲区中字符的个数
private int pos=0; //数组元素的下标(当前读取的位置)
public MyBufferedReader(Reader r ){ //使用父类对象※※※※
this.r = r;
}
public int myRead() throws IOException {
if(count<=0){
count = r.read(cbuf);
if(count==-1){
return -1;//代表读取到文件末尾
}
pos=0;
}
char ch = cbuf[pos];
count--;
pos++;
return ch;
}
public String myReadLine() throws IOException{
StringBuilder sb = new StringBuilder();
int ch=0;
while( (ch=myRead())!=-1 ){
if(ch=='\r'){
continue;
}
if(ch=='\n'){
return sb.toString();
}
sb.append((char)ch);
}
if(sb.length()!=0){
return sb.toString();
}
return null;
}
public void myClose() throws IOException{
r.close(); //关流
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return r.read(cbuf, off, len);
}
@Override
public void close() throws IOException {
System.out.println("同意关闭...");
r.close();
System.out.println("下次再见...");
}
}
测试代码如下:
@Test
public void testMyBufferedReadLineDemo() throws IOException {
InputStreamReader r = new InputStreamReader(
new FileInputStream("a.txt"));
MyBufferedReader br = new MyBufferedReader(r);
String str = null;
while ((str = br.myReadLine()) != null) {
System.out.println(str);
}
br.myClose();
}
测试结果:
vfgrfbate
41215
dlspo找那个呢 汇总发生了可能发fe156122
546162156
nunjj
结果和随机输入到a.txt文件一样!!!