增添属性和有用的接口

利用层次化对象动态和透明地添加单个对象的能力的做法叫作“装饰器”(Decorator)方案——“方案”属于本书第16章的主题(注释①)。装饰器方案规定封装于初始化对象中的所有对象都拥有相同的接口,以便利用装饰器的“透明”性质——我们将相同的消息发给一个对象,无论它是否已被“装饰”。这正是在Java IO库里存在“过滤器”(Filter)类的原因:抽象的“过滤器”类是所有装饰器的基础类(装饰器必须拥有与它装饰的那个对象相同的接口,但装饰器亦可对接口作出扩展,这种情况见诸于几个特殊的“过滤器”类中)。
子类处理要求大量子类对每种可能的组合提供支持时,便经常会用到装饰器——由于组合形式太多,造成子类处理变得不切实际。Java IO库要求许多不同的特性组合方案,这正是装饰器方案显得特别有用的原因。但是,装饰器方案也有自己的一个缺点。在我们写一个程序的时候,装饰器为我们提供了大得多的灵活性(因为可以方便地混合与匹配属性),但它们也使自己的代码变得更加复杂。原因在于Java IO库操作不便,我们必须创建许多类——“核心”IO类型加上所有装饰器——才能得到自己希望的单个IO对象。
FilterInputStream和FilterOutputStream(这两个名字不十分直观)提供了相应的装饰器接口,用于控制一个特定的输入流(InputStream)或者输出流(OutputStream)。它们分别是从InputStream和OutputStream衍生出来的。此外,它们都属于抽象类,在理论上为我们与一个流的不同通信手段都提供了一个通用的接口。事实上,FilterInputStream和FilterOutputStream只是简单地模仿了自己的基础类,它们是一个装饰器的基本要求。

时间: 2024-10-28 17:30:48

增添属性和有用的接口的相关文章

HTML5新元素,新属性及新JavaScript接口的一些复杂新特性

尽管http://www.aliyun.com/zixun/aggregation/79228.html"> HTML5 的实现还有很长的路要走,但 HTML5 正在改变 Web. 作为新一代的 HTML 标准,HTML5 不仅强化了 Web 网页的表现性能,还追加了本地数据库等 Web 应用的功能.虽然 HTML5 标准仍处于完善之中.然而,大部分新版本的浏览器已经能够支持某些 HTML5 的功能了.HTML5 标准所描述的功能非常强大,如:它提供了一些新的元素和属性,例如 <na

Kotlin学习(四)—— 类和对象,继承,覆盖,抽象类,属性和字段,接口,可见性修饰符,扩展

一.类和对象 1. 类 Kotlin和java的类的声明都是一样的,用class表示,比如 class TestClass { } 如果是空类的话,大括号都可以省了 2.构造函数 一个主构造函数和多个次要函数,主函数在类名后,如 class TestClass { //主函数 class TestClass constructor(firstName: String) { init { print("这里初始化") } } } 如果主构造函数没有任何注解或者可⻅性修饰符,可以省略这个

java的OutputStream的类型

这一类别包括的类决定了我们的输入往何处去: 一个字节数组(但没有String:假定我们可用字节数组创建一个): 一个文件:或者一个"管道". 除此以外,FilterOutputStream为"破坏器"类提供了一个基础类,它将属性或者有用的接口同输出流连接起来.这将在以后讨论. 表10.2 OutputStream的类型   Class   Function   Constructor Arguments   How to use it   ByteArray-Out

Java IO 之 OutputStream源码

Writer      :李强强   一.前言 上一篇<Java IO 之 InputStream源码>,说了InputStream.JDK1.0中就有了这传统的IO字节流,也就是 InputStream 和 OutputStream.梳理下两者的核心: InputStream中有几个 read() 方法和 OutputStream中有几个 write() 方法.它们是一一对应的,而核心的是read()和write()方法.它们都没实现,所有本质调用是各自实现类实现的该两个方法. read()

[Java开发之路](8)输入流和输出流

1. Java流的分类 按流向分: 输入流: 可以从其中读入一个字节序列的对象称作输入流. 输出流: 可以向其中写入一个字节序列的对象称作输出流. 这些字节序列的来源地和目的地可以是文件,而且通常都是文件,但是也可以是网络连接,甚至是内存块.抽象类InputStream和OutputStream构成了输入和输出类层结构的基础. 按数据传输单位分: 字节流: 以字节为单位传输数据的流 字符流: 以字符为单位传输数据的流 按功能分: 节点流: 用于直接操作目标设备的流 过滤流: 是对一个已存在的流的

为什么java接口里不能有成员属性?

问题描述 为什么java接口里不能有成员属性? 为什么java接口里不能有成员属性?为什么java接口里不能有成员属性? 解决方案 java接口中只能有静态常量和抽象方法的规范. 解决方案二: 这是语法规定,接口是特殊的抽象类.即只包含抽象方法和常量.

ASP.NET MVC Model元数据及其定制:一个重要的接口IMetadataAware

在介绍用于自定义Model元数据属性的AdditionalMetadataAttribute特性时我们提到了它实现的接口IMedataAware,我们说这是一个非常重要并且有用的接口,通过自定义实现该接口的特性我们可以对最终生成的Model元数据进行自由地定制.如下面的代码片断所示,IMedataAware接口具有唯一的方法成员OnMetadataCreated.当Model元数据被创建出来后,会先获取上述的这一系列标注特性对其进行初始化,然后获取应用在目标元素上所有实现了IMedataAwar

什么时候用抽象类,什么时候用接口 收藏

什么时候用抽象类,什么时候用接口  "接口是完全抽象的成员集合,它的成员都无法在接口定义时实现,我们可以将它看作是为操作定义合同,接口的实现完全留给开发者去做.它们之间的区别,如果认真分析,还是有不少的:在JAVA中,类只能是从一个基类继承,所以如果要使用抽象类为一组类提供多态性,这些类必须都是从那个类继承的:接口就不一样了,它不但可以用一个类或结构实现多个接口,一个接口还可以有多个实现."        抽象类是一种不能实例化而必须从中继承的类.抽象类可以完全实现,但更常见的是部分实

ArcGIS Engine开发之旅04---ARCGIS接口详细说明

原文:ArcGIS Engine开发之旅04---ARCGIS接口详细说明 ArcGIS接口详细说明... 1 1.      IField接口(esriGeoDatabase)... 2 2.      IFieldEdit接口(esriGeoDatabase)... 2 3.      IFields接口(esriGeoDatabase)... 2 4. IRow接口(esriGeoDatabase)... 3 5. ITable接口(esriGeoDatabase)... 3 6. IAr