装饰设计模式
当想要对已有对象进行功能增强时,可以自定义类,将已有对象传入,基于已有的功能,进行增强,自定义的类就叫做装饰类。
装饰类通常会通过构造方法来接受已有的被装饰的对象,并基于被装饰类的功能,提供更强的功能。
LineNumberReader 类:提供了行号的设置和获取方法。是BufferedReader的子类
import java.io.*;
class LineNumberReaderDemo
{
public static void main(String[]args)throws IOException
{
FileReader fr=new FileReader("buff.txt");
LineNumberReader lnr=new LineNumberReader(fr);
FileWriter fw=new FileWriter("buff_lineCopy.txt");
BufferedWriter bfw=new BufferedWriter(fw);
String s=" ";
while((s=lnr.readLine())!=null)
{
bfw.write(lnr.getLineNumber()+s);
bfw.newLine();
}
lnr.close();
bfw.close();
}
}
自己实现LineNumberReader中的设置行号方法和获取行号方法
import java.io.*;
class MyLineNumberReader
{
private FileReader fr;
private int lineNumber=0;
MyLineNumberReader(FileReader fr)
{
this.fr=fr;
}
public String myReadLine()throws IOException
{
lineNumber++;//每读一行就加1
StringBuilder sb=new StringBuilder();
int num=0;
while((num=fr.read())!=-1)
{
if(num=='\r')
continue;
if(num=='\n')
return sb.toString();
sb.append((char)num);
}
return null;
}
public int myGetNumberLine()
{
return lineNumber;
}
public void mySetLIneNumber(int lineNumber)
{
this.lineNumber=lineNumber;
}
}
class MyLineNumberReaderDemo
{
public static void main(String[]args)throws IOException
{
FileReader fr=new FileReader("buff.txt");
MyLineNumberReader mlnr=new MyLineNumberReader(fr);
String s=" ";
while ((s=mlnr.myReadLine())!=null)
{
System.out.println(mlnr.myGetNumberLine()+s);
}
}
}