装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。在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(); } } }
执行测试类后,会发现在控制台上打印输出的文件内容,每行之间比原先增加了一个空行。