黑马程序员技术交流社区

标题: 装饰类 [打印本页]

作者: 王_强    时间: 2013-3-29 09:53
标题: 装饰类
class MyBufferedReader extends Reader {  
           Reader r = null;  
           //使用接口Reader,使用多态特性
           MyBufferedReader(Reader r){   
                this.r = r;  
            }  
            //定义读取一行的方法  
         public String  myReadLine()throws IOException{           
               //定义一个StringBuilder对象,存放一行的数据  
             StringBuilder sb = new StringBuilder();  
                 int ch = 0;  
                
                 //读取字符
           while((ch = r.read())!=-1){  
                   if(ch == '\r')  
                        continue;  
                   //判断是否换行了,换行就返回这行的数据sb,没有没有换行,就继续添加
           if(ch == '\n')      
                        return sb.toString();  
                    else  
                        sb.append((char)ch);  
               }                        
                
        if(sb.length()!=0)  //由于上面只有读取到一行的结束标识,才返回,所以对于最后一行不是整行的数据进行获取,以免丢失   
                       return sb.toString();  
              return null;    //读到文件结尾,返回null   
            }     
            @Override  //实现Reader的抽象方法
            public int read(char[] cbuf, int off, int len) throws IOException {  
        return r.read(cbuf,off,len);  
    }  
      //关闭流资源
            public void close() throws IOException {  
               r.close();  
           }  
           public void myClose() throws IOException{         
          r.close();      
           }  
        }  
这是毕老师上课讲的装饰模式的一个类,为什么这里要继承Reader呢,装饰类不是说避免继承的吗?
作者: 余勇    时间: 2013-3-29 13:55
装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。

作者: VOIDMAIN    时间: 2013-3-29 17:55
本帖最后由 VOIDMAIN 于 2013-3-29 17:57 编辑

读取流的父类就是reader,不管是字节流还是字符流,读都是通过read方法实现的,而你这个例子是模拟字符缓冲流,所以必须要继承reader中的read方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2