您的位置:首页 > 其它

设计模式5#装饰模式

2016-04-03 23:47 405 查看
装饰模式

在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能。三种方法添加功能:1继承 2封装:游离体系之外 3:装饰:加入了体系 PS:装饰食指就是封装的变种,封装一个该体系的父类。

下面是三种方法的对比:



装饰模式思想:封装父类对象,自己要加强的自己做,自己不做的让父类做。

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

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

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

被封装的父类MyBufferedRead(自己解决读行时调用myRead()方法pos越界):

package cn.hncu.pattern.decorator.v1;

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

public class MyBufferedRead extends Reader {
private Reader f;//封装
private int count=0;//记录当前缓冲区的字符个数
private int pos=0;//记录游标,当前读取的是数组的哪一个元素
private char[] chs=new char[1024];

public MyBufferedRead(FileReader f) {
super();
this.f = f;
}
public int myRead() throws Exception{//缓冲区 读

//当缓冲区为0时 再去读
if(count<=0){//因为count是全局变量 如果只判断count==0的话那么下次读总会是count=-1;导致程序不断做,导致pos越界。
//这里用count<=0成功解决问题。
count=f.read(chs);//这里是读到一个缓冲区中去。
if(count<0){//到达文件末尾,值为-1
return -1;
}
pos=0;//重新定位游标
}
char ch;
//
ch = chs[pos];
pos++;
count--;
return ch;

}
public String myReadLine() throws Exception{//一次读一行
StringBuilder strBuild=new StringBuilder();
int ch=0;
while((ch=myRead())!=-1){
if(ch=='\r'){//处理不同系统的换行,这里是对\r不做处理让其跳过
continue;
}
if(ch=='\n'){
return strBuild.toString();
}
strBuild.append((char)ch);
}
if(strBuild.length()!=0){//如果读到最后还有
return strBuild.toString();
}
return null;
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return f.read(cbuf, off, len);
}
@Override
public void close() throws IOException {
f.close();
}
}


被封装的父类MyBufferedRead(借用父类的read):

package cn.hncu.pattern.decorator.v1;

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

public class MyBufferedRead extends Reader {
private Reader f;//封装
private int count=0;//记录当前缓冲区的字符个数
private int pos=0;//记录游标,当前读取的是数组的哪一个元素
private char[] chs=new char[1024];

public MyBufferedRead(FileReader f) {
super();
this.f = f;
}
public int myRead() throws Exception{//缓冲区 读
//当缓冲区为0时 再去读
if(count==0){
count=f.read(chs);//这里是读到一个缓冲区中去。
if(count<0){//到达文件末尾,值为-1
return -1;
}
pos=0;//重新定位游标
}
char ch=chs[pos];
pos++;
count--;
return ch;
}
public String myReadLine() throws Exception{//一次读一行
StringBuilder strBuild=new StringBuilder();
int ch=0;
while((ch=f.read())!=-1){
if(ch=='\r'){//处理不同系统的换行,这里是对\r不做处理让其跳过
continue;
}
if(ch=='\n'){
return strBuild.toString();
}
strBuild.append((char)ch);
}
if(strBuild.length()!=0){//如果读到最后还有
return strBuild.toString();
}
return null;
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return f.read(cbuf, off, len);
}
@Override
public void close() throws IOException {
f.close();
}
}


测试的TestMyBufferReader类(main类):

package cn.hncu.pattern.decorator;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;

import cn.hncu.pattern.decorator.v1.MyBufferedRead;

public class TestMyBufferReader {
public static void main(String[] args) throws Exception{
myRead();
System.out.println();
System.out.println("////////////////////////////////");
myReadLine();

}

private static void myReadLine() throws Exception{
FileReader f=new FileReader("b.txt");
MyBufferedRead buf=new MyBufferedRead(f);
String str=buf.myReadLine();
while(str!=null){
System.out.println(str);
str=buf.myReadLine();
}
buf.close();

}

private static void myRead() throws FileNotFoundException, Exception {
FileReader f=new FileReader("b.txt");
MyBufferedRead buf=new MyBufferedRead(f);//流的套接,传入参数,
int ch=0;
while((ch=buf.myRead())!=-1){//调用myRead方法,直到文件到达末尾
System.out.print((char)ch);
}
}

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