处理流:BufferReader 节点流:FileReader
常用其readine()方法:一次性读取一行
生成对象的方法与一般方法不同
构造函数内的参数是FileReader类型的对象
import java.io.*;
class Test{
public static void main(String args[]){
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try{
fileReader = new FileReader("D:/javacode/src/BufferReader/users.txt");
bufferedReader = new BufferedReader(fileReader);
String line = null;
while(true){
line = bufferedReader.readLine();
if (line == null){
break;
}
System.out.println(line);
}
}
catch(Exception e){
System.out.println(e);
}
finally{
try{
bufferedReader.close();
fileReader.close();
}
catch(Exception e ){
System.out.println(e);
}
}
}
}
在使用处理流BufferedReader时,必须要有一个节点流FileReader。实质上bufferedReader.readLine()是对filereader的文件进行读取。这是一种装饰者模式。
装饰者模式
class AWorker implements Worker{
private Worker worker;
//此时,当构造函数里面为(Plumber)时,函数将进行Plumber.doSomeWork.
public AWorker(Worker worker){
this.worker = worker;
}
public void doSomeWork(){
System.out.println("你好");
worker.doSomeWork();
}
}
interface Worker{
public void doSomeWork();
}`
class Plumber implements Worker{
public void doSomeWork(){
System.out.println("修水管");
}
}
class Carpenter implements Worker{
public void doSomeWork(){
System.out.println("修门窗");
}
}
class Test{
public static void main(String args[]){
//生成一个A公司水管工对象
Plumber plumber = new Plumber();
//Plumber向上转型为AWorker
AWorker aWorker1 = new AWorker(plumber);
aWorker1.doSomeWork();
Carpenter carpenter = new Carpenter();
AWorker aWorker2 = new AWorker(carpenter);
aWorker2.doSomeWork();
}
}
我们将AWorker这样的类叫做装饰者,Plumber,Carpenter叫做被装饰者
如果不使用装饰者模式,假设还有BWorker,那么将对有AWorker和两个工人子类,BWorker和两个工人子类。这样就会有很多子类。
使用装饰者模式,对于多个公司都有的工人,就可以减少这部分的类。不论是ABCDEFG公司的水管工或木匠,只要他们工作有相同处,就可以通过装饰者模式,方便调用。
比较:不使用装饰着模式,若有7个公司 3个工人,则需要写最少21个类
使用装饰者模式,最需要最少9个类
回到之前的流操作,BufferedReader相当于装饰者,FileReader相当于被装饰者。