修饰者模式

java.io 这个包里有一个类,比较特别,这就是BufferedReader。我们从JDK的源码里,找到它的实现:

public class BufferedReader extends Reader {
    public BufferedReader(Reader in, int sz) {
        super(in);
        if (sz <= 0)
            throw new IllegalArgumentException("Buffer size <= 0");
        this.in = in;
        cb = new char[sz];
        nextChar = nChars = 0;
    }
}

可以看到,BufferedReader本身就是一个Reader,因为它继承自Reader,同时,还有一个名为 in 的成员变量,也是Reader类型的,然后还开辟了一个数组。实际上,这个数组是为了做缓存的,我们可以一次从 in 这个成员对象中读取多个字符存入 cb 中。当真正调用BufferedReader 的 read 方法的时候,就直接从 cb 中读取了,提高了读取的性能。也就是说BufferedReader所提供的 read 方法经过了 cb 这个缓存的加速,其性能会高于直接从 in 这个对象去读取。这是一种增强普通的 Reader 对象的技术。

注意一点,BufferedReader在对一个Reader的对象做增强的时候,只要求了对象是Reader类型的,并没有要求对象是具体哪个类型。这个in对象可以是SocketReader,也可以是FileReader。

这种本身是一种类型,保持类型接口不变,又能对该类型的其他子类进行加强的能力,就叫装饰者。就好像,我们在一个对象上面增加一种装饰,使得它更好看了,或者功能更强大了。看完了代码再看类图就比较清楚了:

可见,decorator模式,是一种可以为对象增加额外能力的设计模式。

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

我们的完整版。从此以后,就可以直接使用 br 了。即可以使用 Reader 接口规定的read方法,也可以使用 BufferedReader 自己增强的 readLine方法,一次读入一行字符串。

看,小小的一行代码,包含了适配器和装饰器。Java 的 IO的全部知识都在这里了。从设计模式的角度去学习输入输出,就像庖丁手里的那把刀,真是 “恢恢乎其于游刃必有余地矣”。

本文分享自微信公众号 - HinusWeekly(gh_4b8b4eda4e40),作者:海纳

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 新生代的垃圾回收:Copy GC之基本原理

    据我所能查到的资料,基于复制的GC算法最早是Marvin Minsky提出来的。 这个算法的思路很简单,总的来说,就是把空间分成两部分,一个叫分配空间(Allo...

    海纳
  • 如何学习Java

    不要被什么科班出身之类的说法吓坏了。虽然我是科班出身,但我始终觉得,只要你肯努力,这里面并没有什么无法逾越的鸿沟,最重要的是不要好高骛远,也不要急于求成。学习和...

    海纳
  • Python的三个问题

    第一,以下程序的执行结果是什么? def foo(a = []): a.append(1) print a foo()foo() 第二,以下...

    海纳
  • R海拾遗---热图绘制-pheatmap

    新买的蓝牙耳机到了,试了试感觉还不错,低音也非常出色,窗外的颜色变得丰富了起来,看着街角那家咖啡店,仿佛回到了昨天,血色染红的天空在斑斓的世界之上,我匆匆茫茫的...

    用户7760819
  • 生信代码:“热图”来袭(pheatmap)

    热图可以聚合大量的数据,并可以用一种渐进色来优雅地表现,可以很直观地展现数据的疏密程度或频率高低。

    科研菌
  • pheatmap|暴雨暂歇,“热图”来袭!!!

    热图可以聚合大量的数据,并可以用一种渐进色来优雅地表现,可以很直观地展现数据的疏密程度或频率高低。

    西游东行
  • R 热图绘制heatmap②

    用户1359560
  • 【应用】Python做文本挖掘的情感极性分析

    「情感极性分析」是对带有感情色彩的主观性文本进行分析、处理、归纳和推理的过程。按照处理文本的类别不同,可分为基于新闻评论的情感分析和基于产品评论的情感分析。其中...

    陆勤_数据人网
  • Python开发规范及文件命名

    py3study
  • RAC(ReactiveCocoa)介绍(九)——RACSubject流程分析

    之前介绍了RACSignal类以及使用方法,这次要介绍的是RACSignal的子类:RACSubject。 先看下RACSubject基本使用方法:

    我只不过是出来写写代码

扫码关注云+社区

领取腾讯云代金券