概述:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有对象的功能,并提供加强功能。那么自定义的该类,就成为装饰类。
与继承的区别:
* 装饰模式比继承要灵活,避免了继承体系的臃肿,而且还降低了类与类之间的关系
* 装饰类因为增强已有对象,具备的功能和已有对象是相同的,只不过是提供了更强的功能,所以装饰类和被装饰类通常都属于一个体系(父类、接口)中
例子:实现读取文件每次能够读一行,并且还能够记录行号
装饰增强后的类:
/**
* 每次读取一行,并记录行号
*/
public class MyLineNumberReader {
private Reader reader;
/**记录行号*/
private int lineNumber;
/**
* 在构造方法中注入Reader
*/
MyLineNumberReader(Reader reader) {
this.reader = reader;
}
/**
* 一次读一行的方法
*/
public String myReadLine() throws IOException {
lineNumber++;
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=reader.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;
}
public void myClose() throws IOException {
reader.close();
}
public void setLineNumber(int lineNumber) {
this.lineNumber = lineNumber;
}
public int getLineNumber() {
return lineNumber;
}
}
public class Test {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("f:\\a.txt");
MyLineNumberReader mylnr = new MyLineNumberReader(fr);
String line;
while((line=mylnr.myReadLine())!=null) {
System.out.println(mylnr.getLineNumber()+":"+line);
}
mylnr.myClose();
}
}
结果:(每一行都带有行号)
1:aaaaaaaa
2:bbbbbbb
3:ccccccc
4:ddddddd