/*
装饰设计模式:基于已经存在的功能,提供增强的功能
装饰设计模式的由来:
Rreader
---TextReader
---MediaReader
提高子类的读的效率
Reader
---TextReader
---BufferedTextReader
---MediaReader
---BufferedMediaReader
---OtherReader
---BufferedOtherReader
既然都是提高读的效率,所以就把这个功能提取出来,封装到一个类
中,谁需要被提高效率就把谁作为参数传递给该类的构造方法
class BufferedReader{
private Reader reader;
public BufferedReader(Reader reader){
this.reader = reader;
}
}
使用装饰设计模式后,继承体系如下
Reader
---TextReader
---MediaReader
---OtherReader
---BufferedReader
1:装饰设计模式使原有继承体系变简单了
2:因为是在原有功能提供增强功能,所以这个类还属于原体系
*/
/*import java.io.*;
class test{
public static void main(String[] args)throws IOException{
FileReader fr = new FileReader("temp.txt");
LineNumberReader bnr = new LineNumberReader(fr);
String line = null;
bnr.setLineNumber(4);
while((line = bnr.readLine())!=null){
System.out.println(bnr.getLineNumber()+":"+line);
}
bnr.close();
}
}*/
//自定义LineNumberReader
import java.io.*;
class MyLineNumberReader extends MyBufferedReader{
private int lineNumber;
public MyLineNumberReader(Reader r){
super(r);
}
public void setLineNumber(int lineNumber){
this.lineNumber = lineNumber;
}
public int getLineNumber(){
return lineNumber;
}
//重写一次读一行的功能
public String myReadLine()throws IOException{
++lineNumber;
return super.myReadLine();
}
}
//上篇中有介绍
class MyBufferedReader{
private Reader r;//具备读功能的成员
private char[] arr = new char[1024];//提高效率的缓冲区
private int index;
private int count;//统计缓冲区中的字符个数
public MyBufferedReader(Reader r){
this.r = r;
}
//一次读一个字符的功能
public int myRead()throws IOException{
//先判断缓冲区中是否有字符
if(count==0){
//从文件中读一批数据到缓冲区
count = r.read(arr);
index = 0;//下标置为0,从头开始取
}
if(count<0){
return -1;
}
int num = arr[index];//从缓冲区中取一个字符
count--;//数量-1
index++;
return num;
}
//一次读一行的功能
//反复调用myRead()方法,不够一行的时候存储,够一行的时候返回
public String myReadLine()throws IOException{
StringBuilder sb = new StringBuilder();//实现存储字符
int num;
while((num=myRead())!=-1){
if(num=='\r')
continue;
else if(num=='\n')
return sb.toString();
else
sb.append((char)num);
}
return null;
}
public void myClose()throws IOException{
r.close();
}
}
class test{
public static void main(String[] args)throws IOException{
FileReader fr = new FileReader("temp.txt");
MyLineNumberReader mnr = new MyLineNumberReader(fr);
String line = null;
while((line = mnr.myReadLine())!=null){
System.out.println(mnr.getLineNumber()+":"+line);
}
mnr.myClose();
}
}