增添属性和有用的接口
操作条理化工具动态和透明地添加单个工具的本领的做法叫作“装饰器”(Decorator)方案——“方案”属于本书第16章的主题(注释①)。装饰器方案划定封装于初始化工具中的所有工具都拥有沟通的接口,以便操作装饰器的“透明”性质——我们将沟通的动静发给一个工具,无论它是否已被“装饰”。这正是在Java IO库里存在“过滤器”(Filter)类的原因:抽象的“过滤器”类是所有装饰器的基本类(装饰器必需拥有与它装饰的谁人工具沟通的接口,但装饰器亦可对接口作出扩展,这种环境见诸于几个非凡的“过滤器”类中)。
子类处理惩罚要求大量子类对每种大概的组合提供支持时,便常常会用到装饰器——由于组合形式太多,造成子类处理惩罚变得不切实际。Java IO库要求很多差异的特性组合方案,这正是装饰器方案显得出格有用的原因。可是,装饰器方案也有本身的一个缺点。在我们写一个措施的时候,装饰器为我们提供了大得多的机动性(因为可以利便地殽杂与匹配属性),但它们也使本身的代码变得越发巨大。原因在于Java IO库操纵未便,我们必需建设很多类——“焦点”IO范例加上所有装饰器——才气获得本身但愿的单个IO工具。
FilterInputStream和FilterOutputStream(这两个名字不十分直观)提供了相应的装饰器接口,用于节制一个特定的输入流(InputStream)可能输出流(OutputStream)。它们别离是从InputStream和OutputStream衍生出来的。另外,它们都属于抽象类,在理论上为我们与一个流的差异通信手段都提供了一个通用的接口。事实上,FilterInputStream和FilterOutputStream只是简朴地仿照了本身的基本类,它们是一个装饰器的根基要求。