Java.io中使用最广泛的模式是什么?

34

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


5
请看这篇帖子,其中列出了Java标准库中使用的GoF设计模式的全面列表。 - Abhinav Sarkar
1
请查看Java Code Geeks上有关JDK中设计模式的文章 - http://www.javacodegeeks.com/2011/03/design-patterns-in-jdk.html - jb.
5个回答

33

BufferedReader等实现了装饰器模式。任何Reader,例如FileReaderStringReader,都可以使用缓冲功能进行装饰,这是真正的源无关性。


其他模式


反模式

除了其他人所说的,以下是Java库中的几个反模式:

反模式:继承而非组合

来自《Effective Java第二版,项目16:偏爱组合而非继承》:

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

相关问题


反模式:常量接口

来自Effective Java第二版,第19条:仅使用接口定义类型

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

相关问题


反模式:望远镜构造函数和JavaBeans模式

来自《Effective Java第2版,第2项:面对许多构造函数参数时,请考虑使用构建器》(在线摘录):

传统上,程序员使用望远镜构造函数模式,在其中提供仅包含所需参数的构造函数,另一个带有单个可选参数,第三个带有两个可选参数,依此类推[...] 望远镜构造函数模式是有效的,但是当存在许多参数时,编写客户端代码很难,并且更难编写。

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

Bloch建议改用构建器模式

相关问题


27

8

装饰器模式经常在Java I/O中使用。

示例

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

4

我想是装饰器模式。使用它可以创建各种读取器、写入器、输入流和输出流。 例如,参见这里


2

Java.io包中使用的模式。

  1. 装饰器模式

    示例:

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

  2. 抽象工厂模式工厂方法模式

    示例:

    抽象类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
    

    示例:

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

  3. 模板方法模式

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

对于Java中的所有其他模式,请参阅此帖子:

Java核心库中GoF设计模式的示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接