- java.io.*中有一个类叫BufferedReader;
- 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
- 现在我们自己也写一个有这样的功能的类。
import java.io.*;
class MyBufferedReader {
private FileReader r;
MyBufferedReader(FileReader re){
this.r = re;
}
//模拟readLine()方法;构建自己的myReadLine()
public String myReadLine() throws IOException{
//定义一个临时的容器,就用StringBuilder吧.
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=r.read())!=-1) {
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
sb.append((char)ch);
}
//如果文件最后一行没有换行符,但是字符,通过上面的循环无法将其返回给文件读取流;
//于是我们需要做个判断:
//疑问:为什么这里判断sb!=null;就不行,主程序中运行会无限循环?????
if(sb.length()!=0)
return sb.toString();
//如文件或该行为空,就返回空。
return null;
}
public void myClose() throws IOException{
r.close();
}
}
//来测试一下我写的myBufferedReader类;
public class MyBufferReader {
public static void main(String[] args) throws IOException{
MyBufferedReader mbr = null;
try {
FileReader fd = new FileReader("java.txt");
mbr = new MyBufferedReader(fd);
String line = null;
while((line = mbr.myReadLine())!= null) {
System.out.println(line)
}
catch(Exception e) {
System.out.println("文件不存在!");
}
finally {
if(mbr!= null)
mbr.myClose();
}
}
}
- ReadLine方法就是Read方法的功能进行增强;同样的FileReader的增强方法就是BufferedReader方法。这位就是装饰设计模式。
- 装饰设计模式:
当想要对自己已有对象进行功能增强时,可以定义类将已有对象传入, 基于已有功能,并提供增强功能。那么自定义的类就叫做装饰类。 - 特点:装饰类会通过构造方法接受被装饰的对象;
-
装饰与继承的区别:
装饰模式比继承模式要灵活,避免继承模式的臃肿;而且降低了 类与类之间的关系。
装饰类和被装饰类都属于一个体系中。
从继承结构变成组合结构,灵活性特别强。