设计模式之装饰模式

  装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。在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();
		}
	}
}

  执行测试类后,会发现在控制台上打印输出的文件内容,每行之间比原先增加了一个空行。

posted @ 2018-04-06 23:54  奔跑在梦想的道路上  阅读(153)  评论(0编辑  收藏  举报