JavaIO之装饰器模式的理解

关于JavaIO的博客已经满天飞了,代码不计其数,但是大都是草草的结构图,加上常用的代码演示,虽然大部分的文件操作,控制台IO已经可以处理了,但是对于理解为何JavaIO部分有如此之多的类以及众多类的层次关系仍然解析较少。在本文中我尽可能展示清晰类之间的关系,接下来的代码相信都会写的。
JavaIO的设计是装饰器模式应用的典范,接下来用两幅图来表示这众多类的关系。以其中的输入为例。

字节输入

这里写图片描述

字符输入

这里写图片描述
参考wiki上的装饰器解释:

通过使用修饰模式,可以在运行时扩充一个类的功能。
原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通
过在将原来的对象作为修饰类的构造函数的参数。
装饰类实现新的功能,但是,在不需要用到新功能的地方,
它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。
修饰模式是类继承的另外一种选择。类继承在编译时候增加行为,
而装饰模式是在运行时增加行为。
当有几个相互独立的功能需要扩充时,这个区别就变得很重要。
在有些面向对象的编程语言中,类不能在运行时被创建,
通常在设计的时候也不能预测到有哪几种功能组合。
这就意味着要为每一种组合创建一个新类。
相反,修饰模式是面向运行时候的对象实例的,这样就可以在运行时根据需要进行组合

这就是说,修饰器模式的利用使得Java可以在运行时通过组合选择合适的功能。以一个构造参数为例:

BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));

bufferreader是装饰者,**构造参数**FileReader是被装饰者。所谓的组合就是构造参数是不同的类,解决了不同的输入来源的问题。

那么考虑IO时的场景:某小猿要从 (1) **的数据流中进行 (2) 某某不为人知的操作,Ta可能会先读一个字符,也可能任性的读取好多字符存起来慢慢用,也可能只想安静的读数字,总之难以预测。
这众多的类开始组合:在(1)这里可以选择不同的数据来源作为构造参数,被装饰者,均解析为流,如图一中中间的类所示,在(2)中针对不同的操作选择选择不同的类,如图一右侧的类,作为装饰者。这样就能适应多种场景。
在这里不得不吐槽一下,如果大家查看filterStream的各个子类可以发现,这众多的类其实只是添加了寥寥几个特定的方法,简直就是类爆炸!
至于另外的输出,道理上也是类似的。
如果看了觉得有问题欢迎留言讨论哦~~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值