Java---设计模块(装饰模式)

举报
谙忆 发表于 2021/05/27 16:59:53 2021/05/27
【摘要】 ★ 场景和问题 在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能? ★ 引例 写一个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类,使它能够对字符流
(如FileReaderInputStreamReaderPipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
chx!!!
OK.
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

测试类中testMyBufferedReader()方法的输出结果:

写一个MyBufferedReader类,使它能够对字符流
(如FileReaderInputStreamReaderPipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
chx!!!
OK.
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

测试类中testBufferReader()方法的输出结果:

写一个MyBufferedReader类,使它能够对字符流
(如FileReaderInputStreamReaderPipedReader等)进行功能增强:
(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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。