您的位置:首页 > 编程语言 > Java开发

Java设计模式之------装饰模式

2016-05-04 01:33 681 查看

装饰模式

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

例:写一个MyBufferedReader类,使它能够对字符流(如FileReader、InputStreamReader和PipedReader等)进行功能增强:

(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;

(2)提供一个能够每次读取一行字符的myReadLine()方法。

类体系对比:



<span style="font-size:14px;">import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PipedReader;
import java.io.Reader;

public class MyBufferedReader extends Reader{// ★
private Reader r;// 封装  ★  此处也可以使用FileReader或者PipedReader,此两者不需要继承,二Reader需要继承Reader
private char[] buf = new char[1024];
private int count = 0;// 记录当前缓冲区中的字符个数
private int pos = 0;// 游标,数组下标,当前读取的是数组中的哪个元素

public MyBufferedReader(Reader r) { // ★
super();
this.r = r;
}

public int myRead() throws IOException {
// 当缓冲区为空时,用r对象到文件中去读取一组数据到缓冲区中
if (count <= 0) {
count = r.read(buf);
if (count < 0) {
return -1;
}
pos = 0;
}

// 从缓冲区中取一个字符出去
char ch = buf[pos];
pos++;
count--;
return ch;
}

public String myReadLine() throws IOException {
StringBuilder strBuild = new StringBuilder();
int ch = 0;
while ((ch = myRead()) != -1) {
if (ch == '\r') {// 回车
continue;
}
if (ch == '\n') {// 换行
return strBuild.toString();
}
strBuild.append((char)ch);
}
if (strBuild.length() != 0) {
return strBuild.toString();
}

return null;
}

public void MyClose() throws IOException {
r.close();
}

@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return r.read(cbuf, off, len);
}

@Override
public void close() throws IOException {
r.close();
}

}  </span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: