修饰者模式

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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闻道于事

Java之IO流补充

IO流例子 package com.hanqi.maya.util; import java.io.BufferedReader; import java.i...

362100
来自专栏钟绍威的专栏

初识字节流+实现缓冲字节流OutputStream的主要方法构造方法读关流实现BufferedInputStream实现BufferedOutputStream为什么read()返回的是Int型而不是

java中的IO流可以分为两种:字符流和字节流 字符流,顾名思义,就是对字符进行操作,只能操作文本文件 字节流,就是对字节进行操作,然而所有文件都是由字...

20280
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-21(02)总结字符流,IO流编码问题,实用案例必做一遍

C:把集合中的数据存储到文本文件 package cn.itcast_02; import java.io.BufferedWriter; import jav...

38740
来自专栏机器学习实践二三事

java IO体系

IO流 Java中IO流分为两种,字节流和字符流,顾名思义字节流就是按照字节来读取和写入的,字符刘是按照字符来存取的;常用的文件读取用的就是字符流,在网络通信里...

23070
来自专栏java架构师

Android一 流

补充Java知识:流 java.io 四个抽象类: 字节流:InputStream OutputStream 字符流:Reader Writer 站在程序角度上...

361110
来自专栏钟绍威的专栏

简单的Writer和ReaderWriter的主要方法Writer工作原理Reader的主要方法readLine():String

Writer用于写出去到文件中,Reader用于将外面的文件读进来控制台 Writer和Reader有许多子类,但是子类大多都是直接运用父类Writer和R...

20650
来自专栏老付的网络博客

java中的字符和流

在计算机中,我们知道,所有的一切都是归根到底都是二进制的字节形式,包括文件,字符串等等。所以在写程序的时候,尝尝需要和字节打交道。

8920
来自专栏Android知识点总结

Java总结IO篇之字节流与字符流转化

25120
来自专栏Android开发指南

14:IO之字符字节流

37190
来自专栏noteless

-1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流

public void write(byte[] b,int off,int len)

12010

扫码关注云+社区

领取腾讯云代金券