首页 > 程序开发 > 软件开发 > Java >

java设计模式--装饰模式

2017-08-09

java设计模式--装饰模式,在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

装饰模式

装饰模式(Decorator Pattern):
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
特点:
(1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互
(2) 装饰对象包含一个真实对象的引用(reference)
(3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
★ 场景和问题
在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能?
装饰模式就可以实现该功能。同时继承原有类,也能实现该功能
这里模拟实现BufferReader中的readLine()方法,模拟一个带缓存的myRead()方法,对原有的read()方法进行增速
package cn.hncu.pattern.decorator.v1;

import java.io.FileReader;
import java.io.IOException;

public class MyBufferedReader {
	private FileReader r; //封装一个对象
	
	private char[] cbuf = new char[1024];
	private int count=0; //记录当前缓冲区中字符的个数
	private int pos=0; //数组元素的下标(当前读取的位置)
	
	public MyBufferedReader(FileReader r ){
		this.r = r;
	}
	
	public int myRead() throws IOException {
		//对read()方法的功能加强
		if(count<=0){
			count = r.read(cbuf);
			if(count==-1){
				return -1;//代表读取到文件末尾
			}
			pos=0;
		}
		
		char ch = cbuf[pos];
		count--;
		pos++;
		
		return ch;
	}
	
	public String myReadLine() throws IOException{
		//模拟readLine()方法
		StringBuilder sb = new StringBuilder();
		int ch=0;
		while( (ch=myRead())!=-1 ){
			if(ch==&#39;\r&#39;){
				continue;
			}
			if(ch==&#39;\n&#39;){
				return sb.toString();
			}
			
			sb.append((char)ch);
		}
		if(sb.length()!=0){
			return sb.toString();
		}
		return null;
	}
	
	public void myClose() throws IOException{
		r.close();
	}
	
}
a.txt
?sd2332uew
wekjewkjewjk
dfiuewi3223

——————————Over----------
测试
package cn.hncu.pattern.decorator.v1;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import org.junit.Test;

public class TestMyBufferedReader {
	
	////////////1 测试对read()的增强//////////////////////
	
	@Test
	public void bufferedReaderDemo() throws Exception{
		//javaAPI中的类
		FileReader r = new FileReader("a.txt");
		BufferedReader br = new BufferedReader(r);
		int ch=0;
		while( (ch=br.read())!=-1){
			System.out.print((char)ch);
		}
		br.close();
	}
	/* 测试结果:
	 * ?sd2332uew
	 * wekjewkjewjk
	 * dfiuewi3223
	 * 
	 * ——————————Over----------
	 */
	@Test
	public void myBufferedReaderDemo() throws Exception{
		//我们自己写的类
		FileReader r = new FileReader("a.txt");
		MyBufferedReader br = new MyBufferedReader(r);
		int ch=0;
		while( (ch=br.myRead())!=-1){
			System.out.print((char)ch);
		}
		br.myClose();
	}
	/* 测试结果:
	 * ?sd2332uew
	 * wekjewkjewjk
	 * dfiuewi3223
	 * 
	 * ——————————Over----------
	 */
	
	///////////2 测试对readLine()的增强/////////////////////
	@Test
	public void testBufferedReadLineDemo() throws IOException{
		//javaAPI中的类
		BufferedReader br =new BufferedReader( new FileReader("a.txt"));
		String str=null;
		while( (str=br.readLine())!=null ){
			System.out.println(str);
		}
		br.close();
	}
	/* 测试结果:
	 * ?sd2332uew
	 * wekjewkjewjk
	 * dfiuewi3223
	 * 
	 * ——————————Over----------
	 */
	@Test
	public void testMyBufferedReadLineDemo() throws IOException{
		//我们自己写的类
		MyBufferedReader br =new MyBufferedReader( new FileReader("a.txt"));
		String str=null;
		while( (str=br.myReadLine())!=null ){
			System.out.println(str);
		}
		br.myClose();
	}
	/* 测试结果:
	 * ?sd2332uew
	 * wekjewkjewjk
	 * dfiuewi3223
	 * 
	 * ——————————Over----------
	 */
}
相关文章
最新文章
热点推荐