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

来源:互联网 发布:怎么查看淘宝店家电话 编辑:程序博客网 时间:2024/06/05 15:29

★ 场景和问题

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

★ 引例

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

这里做三种类体系对比:

附例码如下:

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();  //关流}@Overridepublic int read(char[] cbuf, int off, int len) throws IOException {return r.read(cbuf, off, len);}@Overridepublic void close() throws IOException {System.out.println("同意关闭...");r.close();System.out.println("下次再见...");}}  

测试代码如下:

        @Testpublic 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();}

测试结果:

vfgrfbate41215dlspo找那个呢 汇总发生了可能发fe156122546162156nunjj

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