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
,例如FileReader
或 StringReader
,可以装饰带有缓冲功能,这真的是源代码遗忘。
其他模式
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包