0
点赞
收藏
分享

微信扫一扫

设计模式(五)--装饰模式

佛贝鲁先生 2022-08-16 阅读 67


★ 场景和问题

在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能?

★ 引例

写一个MyBufferedReader类,使它能够对字符流(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。

这里做三种类体系对比:

设计模式(五)--装饰模式_java

附例码如下:

package SingelModel.pattern.decorator.v3;

import java.io.IOException;
import java.io.Reader;

public class MyBufferedReader extends Reader { //一般使用装饰模式时,继承Reader,功能更强大
private Reader r; //封装一个对象 ※※※※

private char[] cbuf = new char[1024];
private int count=0; //记录当前缓冲区中字符的个数
private int pos=0; //数组元素的下标(当前读取的位置)

public MyBufferedReader(Reader r ){ //使用父类对象※※※※
this.r = r;
}

public int myRead() throws IOException {
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{
StringBuilder sb = new StringBuilder();
int ch=0;
while( (ch=myRead())!=-1 ){
if(ch=='\r'){
continue;
}
if(ch=='\n'){
return sb.toString();
}

sb.append((char)ch);
}
if(sb.length()!=0){
return sb.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 {
System.out.println("同意关闭...");
r.close();
System.out.println("下次再见...");
}

}

测试代码如下:

@Test
public void testMyBufferedReadLineDemo() throws IOException {
InputStreamReader r = new InputStreamReader(
new FileInputStream("a.txt"));
MyBufferedReader br = new MyBufferedReader(r);
String str = null;
while ((str = br.myReadLine()) != null) {
System.out.println(str);
}
br.myClose();
}

测试结果:

vfgrfbate


41215
dlspo找那个呢 汇总发生了可能发fe156122
546162156


nunjj


结果和随机输入到a.txt文件一样!!!




举报

相关推荐

0 条评论