`
woniu1983
  • 浏览: 167781 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java IO 中的装饰者(Decorator)模式(一)

    博客分类:
  • Java
阅读更多
   一直对java.io一知半解,每到用时便google下例子代码----拿来主义,已是我之痼疾。
   这几日便得了闲,拿了JDK 5的Doc、Thinking In Java(4th)和大话设计模式, 对照着JDK 5的源代码
开始看,翻来覆去几回,稍稍有了点眉目,便就上来得瑟一回,记个笔记。

--------------------------------------------------------------------------------------------
一. 从InputStream 及其子类的结构入手

   java.io中类数众多,名称相似,一眼看去,已是花了,至于哪些是输入相关的基本类,哪些又是装饰者类
就分不清了。所以我们就先来理一理其中的结构:

   java.io中的类大致分为两个部分:
    1. InputStream、OutputStream --- 是对字节序列进行操作的抽象类,由JDK1.0发布。
    2. Reader、Writer            --- 是基于Unicode Code Unit 进行操作的抽象类, 由JDK1.1发布。

   我们今天先从InputStream入手,参考JDK文档画出了它的UML 类图(请从附件下载,图的篇幅较宽,就不贴了)
  
  图解 ---参考附件中图的左边部分(InputStream),右边是Reader:

    1. 输入相关的抽象超类:java.io.InputStream

    2. 输入相关的基本类:继承自java.io.InputStream,具体使用方法请参考JDK文档,但大致可以从其名字中看出其含义。总共有8个:
         
 
                   ByteArrayInputStream
                   PipedInputStream
                   SequenceInputStream
                   FileInputStream
                   ObjectInputStream
                   StringBufferInputStream(已经过时,由StringReader代替)
                   javax.sound.sampled.AudioInputStream(外部类)
                   org.omg.CORBA.portable.InputStream(外部类)


    3. 装饰者超类:FilterInputStream,同样也继承自java.io.InputStream

    4. 装饰者子类:继承自FilterInputStream,用于装饰上面的"2. 输入相关的基本类",共有4个:
 
                   BufferedInputStream
                   PushbackInputStream
                   DataInputStream
                   LineNumberInputStream(已经过时)


二. InputStream 和 装饰者模式

   众人皆知java的输入输出包"java.io"是一个装饰者模式的典型案例,这从下面这个代码就可以大致看出:

  
final BufferInputStream bin =
 new BufferInputStream(new FileInputStream("C:\\test.log"));


   但具体是怎样子的还是需要查看JDK源代码:

1.  java.io.InputStream  == 装饰者模式中的所有类(装饰者和被装饰者)的抽象超类
public abstract class InputStream implements Closeable {
     // 定义抽象方法:read
     public abstract int read() throws IOException;
}



   2.java.io.FileInputStream == 具体的被装饰者对象
public class FileInputStream extends InputStream {
    public FileInputStream(String name) throws FileNotFoundException {
        this(name != null ? new File(name) : null);
    }
    // 调用本地read方法
    public native int read() throws IOException;
}


   3.java.io.FilterInputStream == 装饰者对象的超类
  
public class FilterInputStream extends InputStream {
    /**
     * The input stream to be filtered. 
     */
    protected volatile InputStream in;

    protected FilterInputStream(InputStream in) {
	this.in = in;
    }
   
    // 装饰者超类的read方法
    public int read() throws IOException {
	return in.read();
    }
}

   


    4.java.io.BufferedInputStream == 具体的装饰者对象
public class BufferedInputStream extends FilterInputStream {

    public BufferedInputStream(InputStream in) {
	this(in, defaultBufferSize);
    }

    public BufferedInputStream(InputStream in, int size) {
	super(in);
        if (size <= 0) {
            throw new IllegalArgumentException("Buffer size <= 0");
        }
	buf = new byte[size];
    }

    // 具体装饰者类的read方法
    public synchronized int read() throws IOException {
	if (pos >= count) {
	    fill();
	    if (pos >= count)
		return -1;
	}
	return getBufIfOpen()[pos++] & 0xff;
    }
}


   有过模式设计经验的同学不难发现这是一个经典的装饰者模式。

   下一次,我们来看看InputStream和Reader的关系。

  

  
  • 大小: 228.1 KB
0
1
分享到:
评论

相关推荐

    java Decorator装饰模式例子

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...

    Java-从Decorator,Adapter模式看Java/IO

    Java的IO库是一个复杂而强大的系统,其设计思想和实现方式体现了多种设计模式,包括Decorator(装饰者)模式和Adapter(适配器)模式。本文将深入探讨这两个模式在Java/IO中的应用,并通过实例解释它们如何使得Java...

    java-io-decorator.pdf

    在Decorator模式的实现中,每个装饰者类都有一个与被装饰者相同类型的成员变量,以及一个构造函数用于接收并保存被装饰的对象。装饰者通常会重写被装饰者的所有方法,并在这些方法中调用被装饰者的相应方法,以保持...

    Java设计模式之-Decorator装饰模式

    Decorator模式,也称为装饰模式,是设计模式中的一个重要组成部分,它在不改变原有对象接口的前提下,动态地给对象添加新的功能,从而扩展了对象的能力。这篇博客()将深入探讨这个模式的细节。 装饰模式的核心...

    装饰者模式——Decorator

    在Java或其他面向对象语言中,装饰者模式通常通过继承实现,但与传统的继承方式不同,装饰者模式可以提供一种更灵活的方式来扩展对象,而不是硬编码在类的层次结构中。这样避免了因为功能增加而导致的大量子类的创建...

    编程语言java-io-decorator知识点.pdf

    Java的IO体系结构是编程语言Java中的一个重要组成...理解Decorator模式及其在Java IO中的应用,对于深入掌握Java IO体系至关重要。通过这种方式,开发者可以更高效地管理输入输出操作,提高代码的可维护性和可扩展性。

    IO流所涉及到的Decorator设计模式

    Decorator模式的核心思想是装饰者类与被装饰类有相同的接口,它包装了一个对象,并且可以增加或修改该对象的行为。这种模式避免了对原有类进行大量修改,保持了代码的开放性和封闭性。在Java IO系统中,所有的流类都...

    java.io包详细解说

    在Java IO中,Decorator模式主要体现在各种InputStream、OutputStream、Reader和Writer类的使用上。例如,当我们需要对一个InputStream进行缓冲操作时,可以使用BufferedInputStream,它包装了一个原始的InputStream...

    java_io详解

    Java的IO模型采用了装饰者模式(Decorator Pattern),这使得开发者可以根据具体需求动态地组合不同的流类来构建所需的IO功能。例如,如果需要一个具有缓冲功能的文件输入流,可以通过组合`FileInputStream`和`...

    java_IO完全总结

    1. 装饰器模式(Decorator):Java IO系统中广泛使用该模式,通过装饰器模式来扩展IO流的功能。 五、举例说明: 1. Java IO的类和接口:通过查看Java IO包下的类和接口,可以了解到Java在IO上的丰富支持,包括各种...

    设计模式 - 装饰者模式.rar

    7. **示例**:在Java IO库中,`InputStream`、`OutputStream`等类就使用了装饰者模式,如`BufferedInputStream`和`DataInputStream`,它们都装饰了原始的`InputStream`,分别增加了缓冲和数据转换的功能。...

    Java_IO详细教程

    这段代码展示了 Java 中常见的 IO 处理方式,同时引出了一个重要的设计模式——装饰者模式(Decorator Pattern)。装饰者模式是一种结构型设计模式,用于在不改变现有对象结构的情况下动态地给该对象添加新的功能。 ...

    java 装饰模式

    例如,`java.io`包中的许多流类(如BufferedInputStream和PrintStream)就是装饰模式的实例,它们通过装饰基本的InputStream和OutputStream来增强功能,如缓冲和格式化输出。 总的来说,装饰模式是一种灵活的设计...

    java设计模式之装饰模式

    装饰模式(Decorator Pattern)是Java设计模式中的一种结构型模式,它允许在运行时动态地向对象添加新的行为或职责,而不会破坏封装性。这种模式可以用来将多个功能组合在一起,同时保持类的可扩展性和灵活性。在...

    Java设计模式之装饰器模式.docx

    【Java设计模式之装饰器模式】装饰器模式是一种结构型设计模式,它的主要目的是在不修改已有对象的前提下,通过...在Java的IO库、GUI组件以及其他需要动态扩展功能的场景中,装饰器模式都是一个非常实用的设计模式。

    JAVA设计模式在JDK中的应用

    装饰者模式(Decorator) 装饰者模式是在不改变现有对象的基础上,动态地给该对象增加一些职责。JDK中装饰者模式的应用包括: - `java.io.BufferedInputStream(InputStream)`: 增加缓冲功能的输入流。 - `java.io....

    JAVA设计模式

    Java的IO流类库大量使用了装饰器模式。 9. **桥接模式(Bridge)** 桥接模式将抽象部分与实现部分分离,使它们可以独立变化。它将抽象部分和实现部分解耦,使得它们可以独立变化和发展。 10. **代理模式(Proxy)...

Global site tag (gtag.js) - Google Analytics