java.io中使用最多的模式是什么?

What is the most used pattern in java.io?

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


BufferedReader等实现装饰图案。任何一个Reader,如FileReaderStringReader都可以用缓冲功能来装饰,缓冲功能实际上是源不可察觉的。

其他模式

  • java.util.Comparator是一种战略模式。

反模式

为了补充其他人所说的,这些是Java库中的几种反模式:

反模式:继承而不是组合

从有效的Java第二版,项目16:赞成作文比继承:

There are a number of obvious violations of this principle in the Java platform libraries. For example, a stack is not a vector, so Stack should not extend Vector. Similarly, a property list is not a hash table, so Properties should not extend Hashtable. In both cases, composition would have been preferable.

相关问题

  • 更喜欢组合而不是继承?
  • Java继承与组成(实现堆栈)
  • 继承与构成的区别
  • 继承或组成:依赖于"is-a"和"has-a"?
  • 面向对象的最佳实践-继承V组合V接口
  • 我应该使用继承还是组合?
  • 继承与聚合
  • 聚合与组成
  • 使用组合而不是继承的装饰图案

反模式:常量接口

从有效的Java第二版,项目19:仅使用接口定义类型:

There are several constant interfaces in the Java platform libraries, such as java.io.ObjectStreamConstants. These interfaces should be regarded as anomalies and should not be emulated.

相关问题

  • 类应该只实现常量接口吗?
  • 在Java中实现常数的最佳方法是什么?

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

从有效的Java第二版,项目2:考虑建设者面临许多构造函数参数(摘录在线):

Traditionally, programmers have used the telescoping constructor pattern, in which you provide a constructor with only the required parameters, another with a single optional parameters, a third with two optional parameters, and so on [...] The telescoping constructor pattern works, but it is hard to write client code when there are many parameters, and harder still to write it.

A second alternative when you are faced with many constructor parameters is the JavaBeans pattern, in which you call a parameterless constructor to create the object, and then call setter methods to set each required parameter, and each optional parameter of interest. [...] Unfortunately the JavaBeans pattern has serious disadvantages of its own [...] a JavaBean may be in an inconsistent state partway through its construction [and it] precludes the possibility of making a class immutable.

Bloch建议使用构建器模式。

相关问题

  • 这是一个众所周知的设计模式吗?它叫什么名字?
  • 建设者设计模式和工厂设计模式有什么区别?
  • 您什么时候使用构建器模式?

我想他们想听听装饰图案,可以在各种各样的流、读者和作家中找到。

其他图案(小选择):

  • Swing库中的观察者模式
  • javax.xml.parsers包中的工厂模式
  • 迭代器模式,在集合中使用

我敢肯定,我们可以在Java SDK中找到维基百科页面上列出的几乎所有模式的例子。


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

例子

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

我想是装饰图案。创建各种类型的读卡器、编写器、输入和输出流。例如,请参见。


java.io包中使用的模式。

  • 装饰图案。

    实例:

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

  • 抽象工厂模式和工厂方法模式:

    实例:

    抽象类inputstream及其具体的子类:ByteArrayInputStream, FileInputStream, FilterInputStream等。

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    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将字符流转换为字节流。

    您可以在本文中找到更多详细信息

  • 模板方法模式(来源:JournalDev文章)

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

  • 对于Java中的所有其他模式,请参阅以下文章:

    Java核心库中GOF设计模式的实例