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

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

2016-07-24 17:21 531 查看
引例:

写一个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;//记录缓冲区中字符的个数 100
private int pos=0;
public MyBufferedReader(Reader r){
this.r = r;
}

//功能增强1
public int myRead() throws IOException{
if(count<=0){
count = r.read(cbuf);//50
pos=0;
}
if(count==-1){
return -1;
}
count--;//每读一次,缓冲区中的还剩的字符数减1
char ch = cbuf[pos];//本次读的字符
pos++;
return ch;
}

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

//换行:  linux--\n    window--\r\n
public 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;
}

@Override
public 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();
}
@Test
public 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();
}

/////
@Test
public 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();
}

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

}



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