装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。在Java IO流部分中,有不少带缓冲的IO流就采用了装饰模式。我们接下来看一个案例,主要是扩展IO流中的读写功能,实现对文件进行逐行读取,打印输出到控制台中时,让每行之间增加一行的间距。
测试打印的文件为Dog.java:
package decoratorModel;
/**
* 测试装饰模式用的文件
*/
public class Dog implements Comparable<Dog>{
private String name;
private int age;
public Dog() {
}
public Dog(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]\n";
}
@Override
public int compareTo(Dog o) {
if(age>o.age){
return 1;
}
if(age<o.age){
return -1;
}
return name.compareTo(o.getName());
}
}
编写代码如下:
package 装饰模式;
/**
* 为Reader扩展逐行读取的功能
*/
import java.io.IOException;
import java.io.Reader;
public class BufferedReaderSuper {
private Reader reader;
//装饰Reader
public BufferedReaderSuper(Reader reader) {
this.reader=reader;
}
private StringBuffer sb=new StringBuffer();
public String readLine(){
sb.setLength(0);
int ch=0;
try {
while((ch=reader.read())!=-1){
char c=(char)ch;
sb.append(c);
if(c=='\n'){
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
if(sb.length()==0){
return null;
}
return sb.toString();
}
public void close() {
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
-------------------------------------------
package 装饰模式;
/**
* 测试类
*/
import java.io.FileNotFoundException;
import java.io.FileReader;
public class Test {
public static void main(String[] args) {
try {
BufferedReaderSuper brs=new BufferedReaderSuper(new FileReader("Dog.java"));
String str=null;
while((str=brs.readLine())!=null){
System.out.println(str);
}
brs.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
执行测试类后,会发现在控制台上打印输出的文件内容,每行之间比原先增加了一个空行。