Java---设计模块(装饰模式)
【摘要】 ★ 场景和问题
在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能?
★ 引例 写一个MyBufferedReader类,使它能够对字符流(如FileReader、InputStreamReader和PipedReader等)进行功能增强: (1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速; (2)提供一...
★ 场景和问题
在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能?
★ 引例
写一个MyBufferedReader类,使它能够对字符流(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
实现对FileReader的功能加强:
package cn.hncu.pattern.decorator.v1;
import java.io.FileReader;
import java.io.IOException;
public class MyBufferedReader { private FileReader fr;//封装 private char buf[] = new char[1024]; private int count = 0;// 记录当前缓冲区中的字符个数 private int pos = 0;// 游标,数组下标,当前读取的是数组中的哪个元素 public MyBufferedReader(FileReader fr){ this.fr=fr; } public int MyRead() throws IOException{ // 当缓冲区为空时,用fr对象到文件中去读取一组数据到缓冲区中 if(count==0){ count = fr.read(buf); if(count==-1){ return -1; } pos=0;; } // 从缓冲区中取一个字符出去 char ch = buf[pos]; pos++; count--; //返回那个字符 return ch; } public String MyReadLine() throws IOException{ StringBuffer strBuffer = new StringBuffer(); int ch=0; while(((ch=MyRead())!=-1)){ if(ch=='\r'){ continue; } if(ch=='\n'){ return strBuffer.toString(); } strBuffer.append(ch); } if(strBuffer.length()!=0){ return strBuffer.toString(); } return null; } public void MyClose() throws IOException{ fr.close(); }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
测试类:
package cn.hncu.pattern.decorator;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import cn.hncu.pattern.decorator.v1.MyBufferedReader;
public class TestMyBufferReader { public static void main(String[] args) throws IOException { //testMyBufferedReader();//测试自己写的缓存流 testBufferedReader();//看看系统的缓存流读取的是不是和自己读取的相同 } //测试JavaAPI中的BufferedReader类 private static void testBufferedReader() throws IOException { FileReader in = new FileReader("chx.txt"); BufferedReader bf = new BufferedReader(in); int ch=0; while((ch=bf.read())!=-1){ System.out.print((char)ch); } bf.close(); } //测试自己写的MyBufferedReader类 private static void testMyBufferedReader() throws IOException { FileReader fr = new FileReader("chx.txt"); MyBufferedReader mbf = new MyBufferedReader(fr); int ch=0; while((ch=mbf.MyRead())!=-1){ System.out.print((char)ch); } mbf.MyClose(); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
文件chx.txt:
写一个MyBufferedReader类,使它能够对字符流
(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
chx!!!
OK.
- 1
- 2
- 3
- 4
- 5
- 6
测试类中testMyBufferedReader()方法的输出结果:
写一个MyBufferedReader类,使它能够对字符流
(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
chx!!!
OK.
- 1
- 2
- 3
- 4
- 5
- 6
测试类中testBufferReader()方法的输出结果:
写一个MyBufferedReader类,使它能够对字符流
(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
chx!!!
OK.
- 1
- 2
- 3
- 4
- 5
- 6
可以看到,输出的结果是一样的!
下面实现对多个类的缓存增强支持:
package cn.hncu.pattern.decorator.v3;
import java.io.IOException;
import java.io.Reader;
public class MyReader extends Reader{ //如果不写继承,就没有融入体系中去,所以要继承Reader类 private Reader r; private char[] buf = new char[1024]; private int count = 0;// 记录当前缓冲区中的字符个数 private int pos = 0;// 游标,数组下标,当前读取的是数组中的哪个元素 public MyReader(Reader r){ this.r=r; } public int MyReader() throws IOException{ // 当缓冲区为空时,用r对象到文件中去读取一组数据到缓冲区中 if(count<=0){ count=0; } if(count==0){ count=r.read(buf); if(count==-1){ return -1; } pos=0; } // 从缓冲区中取一个字符出去 int ch = buf[pos]; pos++; count--; return ch; } public String MyReaderLine() throws IOException{ StringBuffer strBuffer = new StringBuffer(); int ch=0; while((ch=MyReader())!=-1){ if(ch=='\r'){//回车 continue; } if(ch=='\n'){//换行 return strBuffer.toString(); } char s = (char)ch; strBuffer.append(s); } if(strBuffer.length()!=0){ return strBuffer.toString(); } return null; } public void MyClose() throws IOException { r.close(); } @Override public int read(char[] cbuf, int off, int len) throws IOException { return read(cbuf, off, len); } @Override public void close() throws IOException { r.close(); }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
测试类:
package cn.hncu.pattern.decorator;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import cn.hncu.pattern.decorator.v3.MyReader;
public class TestMyReader { public static void main(String[] args) throws IOException { testMyReaderLine();//测试自己写的缓存流 System.out.println("-------------"); testMyReader(); } //测试自己写的MyReader类的MyReader() private static void testMyReader() throws IOException { InputStreamReader in = new FileReader("chx.txt"); MyReader mr = new MyReader(in); int ch=0; while((ch=mr.MyReader())!=-1){ System.out.print((char)ch); } mr.close(); } //测试自己写的MyReader类的MyReaderLine() private static void testMyReaderLine() throws IOException { FileReader fr = new FileReader("chx.txt"); MyReader mbf = new MyReader(fr); String ch=null; while((ch=mbf.MyReaderLine())!=null){ System.out.print(ch); System.out.println(); } mbf.MyClose(); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
文件和上面的文件是一样的,下面看输出结果:
写一个MyBufferedReader类,使它能够对字符流
(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
chx!!!
OK.
-------------
写一个MyBufferedReader类,使它能够对字符流
(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
chx!!!
OK.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
装饰比继承更灵活,避免了继承造成的体系臃肿问题。
文章来源: chenhx.blog.csdn.net,作者:谙忆,版权归原作者所有,如需转载,请联系作者。
原文链接:chenhx.blog.csdn.net/article/details/51054965
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)