参考书籍
<Head First Design Pattern><Think In Java>
通过对Java I/O的剖析来学习装饰器模式
- Java I/O 类图(JDK1.8)

-
分析
- 抽象组件类:InputStream,OutputStream
- 具体组件类:提供字节流的输入输出ByteArrayInputStream,FileOutputStream等等
- 抽象装饰器类:FilterInputStream,FilterOutputStream
- 具体装饰器:为组件提供额外的功能,如BufferedInputStream提供缓冲功能
-
模式定义
动态的将责任附加到对象上,若要扩展功能, 装饰器提供了比继承更有弹性的替代方案
-
代码示例
public static void main(String[] args) throws IOException { DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("test.txt"))); out.writeUTF("java io"); out.writeInt(47); out.writeDouble(3.14); out.writeUTF("hello world"); out.close(); DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("test.txt"))); System.out.println(in.readUTF()); System.out.println(in.readInt()); System.out.println(in.readDouble()); System.out.println(in.readUTF()); in.close(); }out
java io 47 3.14 hello world分析
FileOutputStream和FileInputStream是具体的流,他们用来生成特定行为的基础流,这里指以文件为载体进行输入输出,BufferedOutputStream和BufferedInputStream相当于在基础流上动态增加的一些功能,DataOutputStream和DataInputStream同理.所以我们也可以自己通过继承自FilterXXX这些抽象装饰器类来增加自己想要的功能.编写自己的I/O装饰器
LowerCaseInputStream.javapublic class LowerCaseInputStream extends FilterInputStream { public LowerCaseInputStream(InputStream in) { super(in); } public int read() throws IOException { int c = in.read(); return (c == -1 ? c : Character.toLowerCase((char)c)); } public int read(byte[] b, int off, int len) throws IOException { int result = super.read(b, off, len); for(int i = off; i < off+result; ++i) b[i] = (byte)Character.toLowerCase((char)b[i]); return result; } }这里只是简单的将字符装换为小写形式