我在求职面试中最近被问到这个问题,我无法回答。那么,java.io中最常用的模式是什么?它是如何使用的?常见的Java库中使用的其他模式是什么?
答案 0 :(得分:30)
BufferedReader
等实现decorator pattern。任何Reader
,例如FileReader
或StringReader
可以使用缓冲功能进行修饰,这实际上是源无关的。
要添加其他人所说的内容,这些是Java库中的几个 anti - 模式:
从 Effective Java 2nd Edition,第16项:赞成合成而不是继承:
Java平台库中存在许多明显违反此原则的行为。例如,堆栈不是向量,因此
Stack
不应扩展Vector
。同样,属性列表不是哈希表,因此Properties
不应扩展Hashtable
。在这两种情况下,组合都是可取的。
从 Effective Java 2nd Edition,第19项:仅使用接口来定义类型:
Java平台库中有几个常量接口,例如
java.io.ObjectStreamConstants
。这些接口应视为异常,不应模拟。
从 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包中使用的模式。
示例:
抽象类java.io.FilterInputStream及其具体子类:ByteArrayInputStream, FileInputStream, FilterInputStream
等
Abstract_factory_pattern和Factory_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
示例:
java.io.OutputStreamWriter
将字节流转换为字符流,java.io.InputStream, java.io.OutputStream, java.io.Reader and java.io.Writer
将字符流转换为字节流。
您可以在此article
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;
}
。
对于java中的所有其他模式,请参阅以下文章: