Java IO 包中的Decorator模式

JDK为程序员提供了大量的类库,而为了保持类库的可重用性,可扩展性和灵活性,其中使用到了大量的设计模式,本文将介绍JDK的I/O包中使用到的Decorator模式,并运用此模式,实现一个新的输出流类。

Decorator模式简介

Decorator模式又名包装器(Wrapper),它的主要用途在于给一个对象动态的添加一些额外的职责。与生成子类相比,它更具有灵活性。

有时候,我们需要为一个对象而不是整个类添加一些新的功能,比如,给一个文本区添加一个滚动条的功能。我们可以使用继承机制来实现这一功能,但是这种方法不够灵活,我们无法控制文本区加滚动条的方式和时机。而且当文本区需要添加更多的功能时,比如边框等,需要创建新的类,而当需要组合使用这些功能时无疑将会引起类的爆炸。

我们可以使用一种更为灵活的方法,就是把文本区嵌入到滚动条中。而这个滚动条的类就相当于对文本区的一个装饰。这个装饰(滚动条)必须与被装饰的组件(文本区)继承自同一个接口,这样,用户就不必关心装饰的实现,因为这对他们来说是透明的。装饰会将用户的请求转发给相应的组件(即调用相关的方法),并可能在转发的前后做一些额外的动作(如添加滚动条)。通过这种方法,我们可以根据组合对文本区嵌套不同的装饰,从而添加任意多的功能。这种动态的对对象添加功能的方法不会引起类的爆炸,也具有了更多的灵活性。

以上的方法就是Decorator模式,它通过给对象添加装饰来动态的添加新的功能。如下是Decorator模式的UML图:

Component为组件和装饰的公共父类,它定义了子类必须实现的方法。

ConcreteComponent是一个具体的组件类,可以通过给它添加装饰来增加新的功能。

Decorator是所有装饰的公共父类,它定义了所有装饰必须实现的方法,同时,它还保存了一个对于Component的引用,以便将用户的请求转发给Component,并可能在转发请求前后执行一些附加的动作。

ConcreteDecoratorA和ConcreteDecoratorB是具体的装饰,可以使用它们来装饰具体的Component。

Java IO包中的Decorator模式

JDK提供的java.io包中使用了Decorator模式来实现对各种输入输出流的封装。以下将以java.io.OutputStream及其子类为例,讨论一下Decorator模式在IO中的使用。

首先来看一段用来创建IO流的代码:

以下是代码片段:

try {
  OutputStream out = new DataOutputStream(new FileOutputStream("test.txt"));
} catch (FileNotFoundException e) {
  e.printStackTrace();
}

时间: 2024-10-31 04:47:40

Java IO 包中的Decorator模式的相关文章

java.io.File中的绝对路径和相对路径.

按照jdk Doc上的说法"绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件.相反,相对路径名必须使用来自其他路径名的信息进行解释.默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名.此目录由系统属性 "user.dir" 指定,通常是 Java 虚拟机的调用目录." 相对路径顾名思义,相对于某个路径,那么究竟相对于什么路径我们必须弄明白.按照上面jdk文档上讲的这个路径是"当前用户目录"也就是"

java如何仅用java.io.*包和数组实现这道题?菜鸟新学,求大神指点

问题描述 java如何仅用java.io.*包和数组实现这道题?菜鸟新学,求大神指点 能在dos运行就行.菜鸟新学,求大神指点. 解决方案 为什么要使用数组呢,感觉List 或 Map 这两个类或其子类实现这个功能更好 解决方案二: Java之美[从菜鸟到高手演变]之Java中的IO 解决方案三: 既然用数组就用数组好了,一共四个数组分别存储雇员的姓名,基本工资,浮动工资和支出,每输入一次往数组中添加记录即可.

java.awt包中,标示区域的是哪个类,类里边可以传一个Rectangle

问题描述 java.awt包中,标示区域的是哪个类,类里边可以传一个Rectangle 我需要一个awt包中的表示区域的类,就类似与C# 中的Region(Rectangle rect)一样,是什么类呢 解决方案 javadoc 希望对你有帮助 解决方案二: 看看这个

关于java.net包中Datagramsocket实现的问题

问题描述 大家好,不知道有没有谁知道java.net包中的DatagramSocket中的send(receive)方法是怎么实现的吗?我看了看,发现在DatagramSocket类中的send的方法发送信息是通过调用DatagramSocketImpl(一个abstract类)来实现的,但是这个方法是空的!那我就找DatagramSocketImpl的子类咯,也就是PlainDatagramSocketImpl类,发现里面的send方法也是空的,那到底java是怎么最终把一个数据报通过sock

谁能帮我举个java.nio包中的ByteOrder类方法(nativeOrder()、toString())的用法?

问题描述 谁能帮我举个java.nio包中的ByteOrder类方法(nativeOrder().toString())的用法?

JAVA - IO包的学习引导文章(摘抄)

什么是IO IO(Input/Output)是计算机输出/输出的接口.Java的核心库java.io提供了全面的IO接口,包括:文件读写,标准设备输出等等.Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入.此外,Java也对块传输提供支持,在核心库java.nio中采用的便是块IO.关于NIO我们在后面还有专门的讨论. 流IO的好处是简单易用,缺点是效率较低.块IO效率很高,但编程比较复杂.Java IO模型 Java的IO模型设计非常优秀,它使用Decor

Java设计模式之装饰模式(Decorator模式)介绍_java

Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator模式中是必须的. Decorator定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活. 为什么使用Decorator 我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生

详解Java设计模式编程中的访问者模式_java

定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作.类型:行为类模式类图: 例子:例如,思考一下添加不同类型商品的购物车,当点击结算的时候,它计算出所有不同商品需付的费用.现在,计算逻辑即为计算这些不同类型商品的价格.或者说通过访问者模式我们把此逻辑转移到了另外一个类上面.让我们实现这个访问者模式的例子. 为了实现访问者模式,最先需要做的是创建能够被添加到购物车中代表不同类型商品(itemElement)的类. ItemElement.ja

Java运用设计模式中的建造者模式构建项目的实例解析_java

1.建造者模式概念定义: 将一个复杂的对象构建与其表示相分离,使得同样的构建过程可以创建不同的表示: 核心 : 构建与表示分离,同构建不同表示 区别于 抽象工厂模式 : (1)与抽象工厂模式 相似,因为它也可以创建复杂对象.主要的区别是建造者模式着重于 一步步构造一个复杂对象,关注的是零件类型和装配工艺的顺序 .而抽象工厂模式着重于多个系列的产品对象(简单的或是复杂的).建造者模式在最后的一步返回产品,而对于抽象工厂来说,产品是立即返回的. (2)在建造者模式里,有个指导者,由指导者来管理建造者