当想要对已有的类进行功能增强时,可以定义类,将已有的类对象传入,基于已有的功能来加强功能,那么自定义的该类称为装饰类
装饰类通常会通过构造方法接收被装饰的类的对象,并基于被装饰的对象的功能,提供更强的功能。
class Person{
void chifan(){
System.out.println("吃饭");
}
}
//这个类的出现是为了增强Person而出现的。
class NewPerson{
private Person p ;
NewPerson(Person p){
this.p = p;
}
public void chifan(){
System.out.println("开胃酒");
p.chifan();
System.out.println("甜点");
}
}
public static void main(String[] args) {
Person p = new Person();
NewPerson p1 = new NewPerson(p);
p1.chifan();
}
}
用我们前面的继承,也可以实现同样的功能。
class NewPerson2 extends Person{//继承
public void chifan(){
System.out.println("开胃酒");
super.chifan();
System.out.println("甜点");
}
}
继承增强功能会导致继承体系越来越臃肿。不够灵活。装饰比继承灵活。
自定义带行号的缓冲区LineNumberReader;
public class LineNumberReader extends MyBufferedReader {
public LineNumberReader(Reader r) {
super(r);
}
private int LineNumber;
public int getLineNumber() {
return LineNumber;
}
public void setLineNumber(int line) {
LineNumber = line;
}
public String myReadLine() throws IOException
{
LineNumber++;
return super.myReadLine();
}
}
获取行号:lnr.getLineNumber();
设置行号从几开始:lnr.setLineNumber(100);
LineNumberReader 步骤
1.创建一个字符写入流对象
FileReader fr=new FileReader ("a.txt");
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数
LineNumberReader lnfr=new LineNumberReader (fr);
3.读取流对象:该缓冲区提供了一个一次读取一行的方法。当返回null时表示,文件读到末尾
String line=null;
while((line=lnfr.readLine())!=null)
{
String s=line;
String linenum=lnfr.getLineNumber();
}
4.关闭
lnfr.close();
|
|