设计模式5#装饰模式
2016-04-03 23:47
405 查看
装饰模式
在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能。三种方法添加功能:1继承 2封装:游离体系之外 3:装饰:加入了体系 PS:装饰食指就是封装的变种,封装一个该体系的父类。
下面是三种方法的对比:
装饰模式思想:封装父类对象,自己要加强的自己做,自己不做的让父类做。
例子:写一个MyBufferedReader类,使它能够对字符流(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
被封装的父类MyBufferedRead(自己解决读行时调用myRead()方法pos越界):
被封装的父类MyBufferedRead(借用父类的read):
测试的TestMyBufferReader类(main类):
在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能。三种方法添加功能: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); } } }
相关文章推荐
- MySql数据库的基本概念和安装
- 求矩阵左上角到右下角路径的最大价值
- <LeetCode><Medium>17Letter Combinations of a Phone Number
- #define 的使用
- fadein和fadeout 轮播
- 第五周学习总结
- 常见序列的傅里叶变换
- 常见序列的傅里叶变换
- 求职宝典 第四章 运算符及其优先级
- 使用AndroidStudio 遇到的小坑及解决办法
- VB.OCR.汉明距离
- 20145203盖泽双 《Java程序设计》第五周学习总结
- 15 个实用的 PHP 正则表达式
- js知识点 归纳
- R语言中的 Vector, Array, List 和 Data Frame
- 用C#写的15子游戏
- HDU 不容易系列之(4)——考新郎(组合错排)
- Linux下的网络环境配置
- TCP/IP协议:最大传输单元MTU 路径MTU
- Redis主从复制