【问题标题】:What is the most used pattern in java.io?java.io 中最常用的模式是什么?
【发布时间】:2011-03-05 09:04:19
【问题描述】:

我最近在工作面试中被问到这个问题,我无法回答。那么,java.io 中最常用的模式是什么,它是如何使用的呢?常见的 java 库中还有哪些其他模式?

【问题讨论】:

标签: java design-patterns io


【解决方案1】:

BufferedReader 等实现decorator pattern。任何Reader,例如FileReaderStringReader,可以装饰带有缓冲功能,这真的是源代码遗忘。


其他模式


反模式

补充一下其他人所说的,这些是 Java 库中的几个 -模式:

反模式:继承而不是组合

来自Effective Java 2nd Edition,第 16 条:优先组合优于继承

Java 平台库中有许多明显违反此原则的行为。例如,堆栈不是向量,因此Stack 不应扩展Vector。同样,属性列表不是哈希表,因此Properties 不应扩展Hashtable。在这两种情况下,组合都会更可取。

相关问题


反模式:常量接口

来自Effective Java 2nd Edition,Item 19: Use interfaces only to define types

Java 平台库中有几个常量接口,例如java.io.ObjectStreamConstants。这些接口应该被视为异常,不应被模仿。

相关问题


反模式:伸缩构造函数和 JavaBeans 模式

来自Effective Java 2nd Edition,Item 2:在面对许多构造函数参数时考虑构建器 (excerpt online):

传统上,程序员使用 伸缩构造函数 模式,在该模式中,您提供一个仅具有必需参数的构造函数,另一个具有单个可选参数,第三个具有两个可选参数,依此类推 [ ...] 伸缩构造器模式是可行的,但是当有很多参数时,客户端代码很难编写,而且更难编写。

当您面对许多构造函数参数时,第二种选择是 JavaBeans 模式,在该模式中,您调用无参数构造函数来创建对象,然后调用 setter 方法来设置每个必需的参数,然后每个感兴趣的可选参数。 [...] 不幸的是,JavaBeans 模式有其自身的严重缺点 [...] JavaBean 在其构造过程中可能处于不一致的状态 [并且它] 排除了使类不可变的可能性。

Bloch 建议改用builder pattern

相关问题

【讨论】:

    【解决方案2】:

    我猜他们想了解Decorator pattern,它可以在各种 Streams、Readers 和 Writers 中找到。

    其他模式(小部分选择):

    我很确定可以找到 Java SDK 中 wikipedia page 中列出的几乎所有模式的示例。

    【讨论】:

      【解决方案3】:

      decorator pattern 常用于 java i/o。

      例子

      BufferedReader br = new BufferedReader(new FileReader("filename.txt")); 
      

      【讨论】:

        【解决方案4】:

        装饰器模式,我想。创建各种类型的 Readers、Writers、输入和输出流。 例如,请参阅this

        【讨论】:

          【解决方案5】:

          java.io 包中使用的模式。

          1. Decorator_pattern

            例子:

            抽象类java.io.FilterInputStream及其具体子类:BufferedInputStream, CheckedInputStream

          2. Abstract_factory_patternFactory_method_pattern 模式:

            例子:

            抽象类InputStream及其具体子类:ByteArrayInputStream, FileInputStream, FilterInputStream

            InputStream input = new FileInputStream("some_file.txt");
            

            以下类可以统一来自字节数组、文件、网络连接、持久存储、管道、字符串等的输入:

            class java.io.InputStream 
                  class java.io.ByteArrayInputStream 
                  class java.io.FileInputStream 
                  class java.io.FilterInputStream 
                  class java.io.ObjectInputStream
                  class java.io.PipedInputStream 
                  class java.io.SequenceInputStream 
                  class java.io.StringBufferInputStream
            
          3. Adapter_pattern:

            例子:

            java.io.InputStreamReader 将字节流转换为字符流,java.io.OutputStreamWriter 将字符流转换为字节流。

            您可以在此article 中找到更多详细信息

          4. Template_method_pattern(来源:journaldev文章)

            java.io.InputStream, java.io.OutputStream, java.io.Reader and java.io.Writer的所有非抽象方法。

          有关java中的所有其他模式,请参阅这篇文章:

          Examples of GoF Design Patterns in Java's core libraries

          【讨论】:

            猜你喜欢
            • 2014-01-31
            • 2014-08-27
            • 1970-01-01
            • 2014-08-21
            • 1970-01-01
            • 1970-01-01
            • 2017-04-10
            • 1970-01-01
            • 2016-04-19
            相关资源
            最近更新 更多