java的设计模式——装饰模式

来源:互联网 发布:linux中chown r 编辑:程序博客网 时间:2024/06/02 01:31

引例:

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

(1)提供带缓冲的MyReader()方法对原来的read增速;

(2)提供每次读取一行字符的MyReaderLine()的方法。

分析:FileReader类里的int read()方法一次只能从数据库里面读出一个字符,传输速度相当的慢,我们在MyBufferReader类中一次从数据库中读出一个数组量的字符,然后从缓存里读取数据的速度就快多了。   就比如你家里要向学校交粮食,你每次从家里带一粒米交到学校和你每次打包或者带一车粮食到学校再一粒粒(学校只收一粒粒的米,就跟你的字符最后还是要一个个的读一样)地数给学校一样的差别,减少了与数据库的交互。

import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.Reader;public class MyBufferedReader extends Reader {//与封装(组合)不同的是它还继承了Reader,跟它成为了一个体系private Reader r;private char[]cbuf = new char[1024];private int count=0;//记录缓冲区中字符的个数 100private int pos=0;public MyBufferedReader(Reader r){this.r = r;}//功能增强1public int myRead() throws IOException{if(count<=0){count = r.read(cbuf);//50pos=0;}if(count==-1){return -1;}count--;//每读一次,缓冲区中的还剩的字符数减1char ch = cbuf[pos];//本次读的字符pos++;return ch;}public void close() throws IOException {r.close();}//换行:  linux--\n    window--\r\npublic String myReadLine() throws IOException{StringBuffer sb = new StringBuffer();int ch=0;while( (ch=myRead())!=-1 ){if(ch=='\r'){continue;}if(ch=='\n'){return sb.toString();}sb.append( (char)ch );//字符连接  str = str+(char)ch;}if(sb.length()!=0){//文件的最后一行是没有换行符的return sb.toString();}return null;}@Overridepublic int read(char[] cbuf, int off, int len) throws IOException {return r.read(cbuf, off, len);}}
<pre name="code" class="java">//测试类import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;import org.junit.Test;public class TestMyBufferedreader {@Test//测试public void jdk_testRead() throws IOException {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();}@Testpublic void my_testRead() throws IOException {InputStreamReader r = new InputStreamReader(new FileInputStream("a.txt"));MyBufferedReader br = new MyBufferedReader( r );int ch=0;while( (ch=br.myRead())!=-1 ){System.out.print((char)ch);}br.close();}    /////@Testpublic void jdk_testReadLine() throws IOException {FileReader r = new FileReader("a.txt");BufferedReader br = new BufferedReader( r );String line = null;while( (line =br.readLine())!=null ){System.out.println(line);}br.close();}@Testpublic void my_testReadLine() throws IOException {InputStreamReader r = new InputStreamReader(new FileInputStream("a.txt"));MyBufferedReader br = new MyBufferedReader( r );String line = null;while( (line =br.myReadLine())!=null ){System.out.println(line);}br.close();}}




0 0
原创粉丝点击