java.io 中最常用的模式是啥?

Posted

技术标签:

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

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

【问题讨论】:

有关 Java 标准库中使用的 GoF 模式的完整列表,请参阅 this post。 查看 Java Code Geeks 关于 JDK 中的设计模式的这篇文章 - javacodegeeks.com/2011/03/design-patterns-in-jdk.html 【参考方案1】:

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


其他模式

java.util.Comparator<T> 是 strategy pattern

反模式

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

反模式:继承而不是组合

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

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

相关问题

Prefer composition over inheritance? java inheritance versus composition (implementing a stack) Difference between Inheritance and Composition Inheritance or composition: Rely on “is-a” and “has-a”? Object Oriented Best Practices - Inheritance v Composition v Interfaces Should I use inheritance or composition? Inheritance vs. Aggregation Aggregation verses Composition Decorator Pattern Using Composition Instead of Inheritance

反模式:常量接口

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

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

相关问题

Should a class implement a constants-only interface? What is the best way to implement constants in Java ?

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

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

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

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

Bloch 建议改用builder pattern。

相关问题

Is this a well known design pattern? What is its name? What is the difference between Builder Design pattern and Factory Design pattern? When would you use the Builder Pattern?

【讨论】:

【参考方案2】:

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

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

Observer pattern 在 swing 库中 Factory pattern 在 javax.xml.parsers 包中 Iterator pattern,用于集合

我很确定可以找到 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 包中使用的模式。

    Decorator_pattern。

    例子:

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

    Abstract_factory_pattern 和 Factory_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
    

    Adapter_pattern:

    例子:

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

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

    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

【讨论】:

以上是关于java.io 中最常用的模式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA IO 输入输出流

你说写代码,最常用的3个设计模式是啥?

java中常用的包类以及包中常用的类方法属性-----io包

c# 中最简单的 IDisposable 模式是啥? [复制]

你说写代码,最常用的3个设计模式是啥?

你说写代码,最常用的3个设计模式是啥?