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

时间:2010-06-18 10:42:36

标签: java design-patterns io

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

5 个答案:

答案 0 :(得分:30)

BufferedReader等实现decorator pattern。任何Reader,例如FileReaderStringReader可以使用缓冲功能进行修饰,这实际上是源无关的。


其他模式


反模式

要添加其他人所说的内容,这些是Java库中的几个 anti - 模式:

反模式:继承而不是组合

Effective Java 2nd Edition,第16项:赞成合成而不是继承

  

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

相关问题


反模式:常量接口

Effective Java 2nd Edition,第19项:仅使用接口来定义类型

  

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

相关问题


Antipattern:telescoping构造函数和JavaBeans模式

Effective Java 2nd Edition,第2项:面对许多构造函数参数时考虑构建器excerpt online):

  

传统上,程序员使用了 telescoping constructor 模式,其中你只提供了一个构造函数,只有所需的参数,另一个只有一个可选参数,第三个有两个可选参数,等等[ ...]伸缩构造函数模式可以工作,但是当有很多参数时很难编写客户端代码,并且更难写入。

     

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

布洛赫建议改为使用builder pattern

相关问题

答案 1 :(得分:23)

我想他们想听听各种Streams,Readers和Writers中可以找到的Decorator pattern

其他模式(小选择):

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

答案 2 :(得分:8)

decorator pattern经常在java i / o中使用。

实施例

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

答案 3 :(得分:4)

装饰师模式,我想。创建所有类型的读者,写作者,输入和输出流。 例如,请参阅this

答案 4 :(得分:1)

java.io包中使用的模式。

  1. Decorator_pattern

    示例:

    抽象类java.io.FilterInputStream及其具体子类:ByteArrayInputStream, FileInputStream, FilterInputStream

  2. Abstract_factory_patternFactory_method_pattern模式:

    示例:

    抽象类InputStream及其具体子类: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
  3. Adapter_pattern

    示例:

    java.io.OutputStreamWriter将字节流转换为字符流,java.io.InputStream, java.io.OutputStream, java.io.Reader and java.io.Writer将字符流转换为字节流。

    您可以在此article

  4. 中找到更多详情
  5. Template_method_pattern(来源:journaldev文章)

    #include <stdio.h> #include <Python.h> int main(int argc, char *argv[]) { Py_Initialize(); PyRun_SimpleString("print('hello from python')"); // fake module char *source = "__version__ = '2.0'"; char *filename = "test_module.py"; // perform module load PyObject *builtins = PyEval_GetBuiltins(); PyObject *compile = PyDict_GetItemString(builtins, "compile"); PyObject *code = PyObject_CallFunction(compile, "sss", source, filename, "exec"); PyObject *module = PyImport_ExecCodeModule("test_module", code); PyRun_SimpleString("import test_module; print(test_module.__version__)"); Py_Finalize(); return 0; }

  6. 的所有非抽象方法

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

    Examples of GoF Design Patterns in Java's core libraries