`
stanxl
  • 浏览: 4061 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

装饰器模式浅谈

 
阅读更多

今天继续学习一种叫做装饰器模式的设计模式。
当相对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有功能,提供加强功能。自定义的类称为装饰类
装饰类通常通过构造器接收被装饰的对象,并基于被装饰对象的功能,提供更强的功能
简单点说,就是这种模式是将已有对象的功能增强,并且以原对象已有的功能方法制作增强方法。好像越说越复杂了!!
比如,我们知道系统内置的BufferedReader类,是一个带缓冲的输入流,并且可以包装其他的节点流 ,它提供了一个readLine()方法,去提高效率,其实Reader是自带缓冲区的,默认是1024*8,即8192byte,而且不能改变,当多读一个字节时,缓冲区就会自动关闭,而BuffferedReader它提供的缓冲区是可以自定义的。
看代码吧:
自定义一个和BufferedReader功能一样的类:

class MyBufferedReader{
    private Reader r;
    public MyBufferedReader(Reader r){
        this.r = r;
    }
    //以下来模拟readLine()方法
    public String readLine()throws Exception{
        StringBuffer sbr = new StringBuffer();
        int ch ; 
        while(true){
            ch = r.read();
            if(ch == '\n') break;//读到行末就break
            if(ch == '\r') continue;//\r回到行首
            if(ch == -1) break;
            sbr.append((char)ch);
        }
        return sb.length() == 0 ? null : sb.toString();
    }
    public void close() throws Exception{
        r.close();
    }
}
public class Test{
    public static void main(String args[]){
        try{
            Reader in = new FileReader("E:/a.txt");
            MyBufferedReader mbr = new MyBufferedReader(in);
            try{
                String line;
                while((line=mbr.readLine()) != null){
                    System.out.println(line);
                }
            }finally{
                mbr.close();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

这里要提一下,main方法里try-catch-finally的写法:
更合理写法:

public class Test{
    public static void main(String[] args){
        try{
            Reader r = new FileReader("E:/a.txt");
            // 当这里有异常时(a.txt文件找不到),下面的try-finally就不会执行
            //也就是说,流没有打开,是没有必要关闭流的;
            //这种写法更合理些
            try{
                //这里操作数据;
            }finally{
                //close()写在这里
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

再看下面的写法:
较不合理写法:

public class Test{
    public static void main(String[] args){
        try{
            Reader r = new FileReader("E:/a.txt");
            //如果这里没有找到a.txt文件,其实就没有必须再去关闭流了,
            //而这种写法里,不管怎么样,最后总是去关闭流,这是不合理的
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //close()写在这里;
        }
    }
}

先写到这里,水平有限,多多指教。

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    浅谈Java设计模式系列-装饰器模式

    主要介绍了Java设计模式系列-装饰器模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java设计模式 版本2

    设计模式之代理模式,请求的链式处理——职责链模式,请求发送者与接收者解耦——命令模式,自定义语言的实现——解释器模式,遍历聚合对象中的元素——迭代器模式,协调多个对象之间的交互——中介者模式,撤销功能...

    design-pattern-java.pdf

    自定义语言的实现——解释器模式(五) 自定义语言的实现——解释器模式(六) 迭代器模式-Iterator Pattern 遍历聚合对象中的元素——迭代器模式(一) 遍历聚合对象中的元素——迭代器模式(二) 遍历聚合对象中的...

    asp.net知识库

    也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动...

    Python-高频-面试-知识点

    装饰器解释下,基本要求是什么? 3 9.新式类和旧式类区别 3 10.__new__和__init__的区别 3 11.单例模式的几种实现方式的及优化? 3 12.作用域的类型有哪些? 5 13.深拷贝和浅拷贝的区别? 5 14.多线程和多进程的区别...

    传智播客扫地僧视频讲义源码

    本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...

    Python核心编程第二版(ok)

     11.3.6 函数(与方法)装饰器   11.4 传递函数   11.5 FormalcArguments   11.5.1 位置参数   11.5.2 默认参数   11.6 可变长度的参数   11.6.1 非关键字可变长参数(元组)   11.6.2 ...

    Python核心编程第二版

     11.3.6 *函数(与方法)装饰器   11.4 传递函数   11.5 Formal Arguments   11.5.1 位置参数   11.5.2 默认参数   11.6 可变长度的参数   11.6.1 非关键字可变长参数(元组)   11.6.2 ...

    Python核心编程(第二版).pdf (压缩包分2部分,第二部分)

     11.3.6 *函数(与方法)装饰器   11.4 传递函数   11.5 formal arguments   11.5.1 位置参数   11.5.2 默认参数   11.6 可变长度的参数   11.6.1 非关键字可变长参数(元组)   11.6.2 ...

    Python核心编程(第二版).pdf (压缩包分2部分,第一部分)

     11.3.6 *函数(与方法)装饰器   11.4 传递函数   11.5 formal arguments   11.5.1 位置参数   11.5.2 默认参数   11.6 可变长度的参数   11.6.1 非关键字可变长参数(元组)   11.6.2 ...

Global site tag (gtag.js) - Google Analytics