装饰设计模式、LineNumberReader
2015-03-17 09:12
120 查看
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有对象的功能,并提供加强功能,那么自定义的该类就成为装饰类。
特点:装饰类通常会通过构造函数接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
例如:
public class MyBufferedReader {
private Reader r;
public MyBufferedReader(Reader r) {
super();
this.r = r;
}
//可以一次读取一行的方法
public String myReadLine() throws IOException
{
//定义一个临时容器。StringBulider容器,应用于存储字符数组
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=r.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
//复写reader中的抽象方法
//复写close方法
public void close() throws IOException
{
r.close();
}
//复写read方法
public int read (char[] c,int off,int len) throws IOException{
return r.read(c, off, len);
}
}
装饰和继承的区别:
装饰模式比继承要灵活,避免了继承体系臃肿。而且降低了类与类之间的关系。装饰类因为是增强已有对象,具备的功能和已有对象是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常都属于一个体系中的。
MyReader专门由于读取数据的类,
LineNumberReader(BufferedReader子类)
跟踪行号的缓冲字符输入流。
方法:setLineNumber(int):设置当前行号。
getLineNumber():获取当前行号。
默认情况下,行编号从0开始,该行号随数据读取在每个行结束符处递增,并可以通过调用setLineNumber更改行号,但是,setLineNumber不会实际更改流中的当前位置,它主要更改将由getLineNumber()返回的值。
练习:模拟一个带行号的缓冲区对象。
class MyLineNumberReader{
private Reader reader;
private int lineNumber;
public MyLineNumberReader(Reader reader){
this.reader=reader;
}
public String MyReadLine() throws IOException{
lineNumber++;//每读取一行时,行数自动加1一次
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=reader.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
public void setLineNumber(int lineNumber){//设置行号
this.lineNumber=lineNumber;
}
public int getLineNumber(){//获取行号
return lineNumber;
}
public void myClose() throws IOException{
reader.close();
}
}
程序优化:由于缓冲区BufferedReader中已经实现了readLine和close方法,且在模拟读取字符流缓冲区时也自定义实现了readLine和close方法,在模拟带行号的缓冲对象时,再次实现readLine和close,代码重复,所以继承BufferedReader或者自定义的缓冲区类,可以减少代码的重复。
优化后的代码:
class MyLineNumberReader extends MyBufferedReader {
private int lineNumber;
public MyLineNumberReader(Reader r){
super(r);
}
public String MyReadLine() throws IOException{
lineNumber++;//每读取一行时,行数自动加1一次
return super.MyReadLine();
}
public void setLineNumber(int lineNumber){//设置行号
this.lineNumber=lineNumber;
}
public int getLineNumber(){//获取行号
return lineNumber;
}
}
当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有对象的功能,并提供加强功能,那么自定义的该类就成为装饰类。
特点:装饰类通常会通过构造函数接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
例如:
public class MyBufferedReader {
private Reader r;
public MyBufferedReader(Reader r) {
super();
this.r = r;
}
//可以一次读取一行的方法
public String myReadLine() throws IOException
{
//定义一个临时容器。StringBulider容器,应用于存储字符数组
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=r.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
//复写reader中的抽象方法
//复写close方法
public void close() throws IOException
{
r.close();
}
//复写read方法
public int read (char[] c,int off,int len) throws IOException{
return r.read(c, off, len);
}
}
装饰和继承的区别:
装饰模式比继承要灵活,避免了继承体系臃肿。而且降低了类与类之间的关系。装饰类因为是增强已有对象,具备的功能和已有对象是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常都属于一个体系中的。
MyReader专门由于读取数据的类,
LineNumberReader(BufferedReader子类)
跟踪行号的缓冲字符输入流。
方法:setLineNumber(int):设置当前行号。
getLineNumber():获取当前行号。
默认情况下,行编号从0开始,该行号随数据读取在每个行结束符处递增,并可以通过调用setLineNumber更改行号,但是,setLineNumber不会实际更改流中的当前位置,它主要更改将由getLineNumber()返回的值。
练习:模拟一个带行号的缓冲区对象。
class MyLineNumberReader{
private Reader reader;
private int lineNumber;
public MyLineNumberReader(Reader reader){
this.reader=reader;
}
public String MyReadLine() throws IOException{
lineNumber++;//每读取一行时,行数自动加1一次
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=reader.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
public void setLineNumber(int lineNumber){//设置行号
this.lineNumber=lineNumber;
}
public int getLineNumber(){//获取行号
return lineNumber;
}
public void myClose() throws IOException{
reader.close();
}
}
程序优化:由于缓冲区BufferedReader中已经实现了readLine和close方法,且在模拟读取字符流缓冲区时也自定义实现了readLine和close方法,在模拟带行号的缓冲对象时,再次实现readLine和close,代码重复,所以继承BufferedReader或者自定义的缓冲区类,可以减少代码的重复。
优化后的代码:
class MyLineNumberReader extends MyBufferedReader {
private int lineNumber;
public MyLineNumberReader(Reader r){
super(r);
}
public String MyReadLine() throws IOException{
lineNumber++;//每读取一行时,行数自动加1一次
return super.MyReadLine();
}
public void setLineNumber(int lineNumber){//设置行号
this.lineNumber=lineNumber;
}
public int getLineNumber(){//获取行号
return lineNumber;
}
}
相关文章推荐
- 黑马程序员——学习Java基础之 io LineNumberReader 之装饰设计模式
- IO流二:IO流之缓冲区BufferedReader、BufferedWriter、装饰设计模式、LineNumberReader
- 黑马程序员——21,字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
- 黑马程序员——Java基础——IO流、字符流、字节流、缓冲区技术、装饰设计模式、LineNumberReader等
- 字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader
- IO流-2.【字符流缓冲区BufferedWriter/BufferedReader】【readLine()方法】【装饰设计模式】【LineNumberReader】
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
- Java学习日志(19-2-IO流-装饰设计模式与LineNumberReader)
- 黑马程序员_十五 【字节流】【装饰模式】【LineNumberReader】
- Java装饰者模式(设计模式)与缓冲字符输入流(LineNumberReader)和打印流
- 字符流缓冲区的增强类LineNumberReader之装饰模式
- 【装饰设计模式】写一个MyBufferedReader实现自己的ReadLine方法、增强BufferedReader的ReaderLine()
- 黑马程序员_<<字符流的缓冲技术和装饰类(BufferedWriter,BufferedReader,LineNumberReader)>>
- day19字符流的缓冲区。自己MyBufferReader的readLine方法。装饰设计模式。字节流。自定义一个缓冲区模拟BufferedInputStream。读取键盘
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
- J2SE中 装饰设计模式之用自定义类去实现BufferedReader类的功能
- javaseday21补充(装饰设计模式 BufferedReader 的小弟 LineNumber 行号媒体文件的复制)
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
- 从BufferedReader到装饰设计模式