1. 模式意图
动态地给一个对象添加一些额外的职责;Decorator模式相比生成子类更为灵活;(别名Wrapper)
有时候,我们需要为一个对象而不是整个类添加一些新的功能,如果使用继承机制来实现,不同的功能组合将会导致类的爆炸.
2. 模式定义
Component: 定义一个对象接口,可以给这些对象动态地添加职责;
ConcreteComponent: 定义一个对象,可以给这个对象添加一些职责;
Decrator: 维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
ConcreteDecratorA/B: 想组件添加职责;
Decrator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作;
3. 模式实现
4. 模式应用
4.1 Java IO
- java.io.InputStream (implements java.io.Closeable)
- java.io.ByteArrayInputStream
- java.io.FileInputStream
- java.io.FilterInputStream
- java.io.BufferedInputStream
- java.io.DataInputStream (implements java.io.DataInput)
- java.io.LineNumberInputStream
- java.io.PushbackInputStream
- java.io.ObjectInputStream (implements java.io.ObjectInput, java.io.ObjectStreamConstants)
- java.io.PipedInputStream
- java.io.SequenceInputStream
- java.io.StringBufferInputStream
- java.io.OutputStream (implements java.io.Closeable, java.io.Flushable)
- java.io.ByteArrayOutputStream
- java.io.FileOutputStream
- java.io.FilterOutputStream
- java.io.BufferedOutputStream
- java.io.DataOutputStream (implements java.io.DataOutput)
- java.io.PrintStream (implements java.lang.Appendable, java.io.Closeable)
- java.io.ObjectOutputStream (implements java.io.ObjectOutput, java.io.ObjectStreamConstants)
- java.io.PipedOutputStream
- java.io.Reader (implements java.io.Closeable, java.lang.Readable)
- java.io.BufferedReader
- java.io.LineNumberReader
- java.io.CharArrayReader
- java.io.FilterReader
- java.io.PushbackReader
- java.io.InputStreamReader
- java.io.FileReader
- java.io.PipedReader
- java.io.StringReader
- java.io.BufferedReader
- java.io.Writer (implements java.lang.Appendable, java.io.Closeable, java.io.Flushable)
- java.io.BufferedWriter
- java.io.CharArrayWriter
- java.io.FilterWriter
- java.io.OutputStreamWriter
- java.io.FileWriter
- java.io.PipedWriter
- java.io.PrintWriter
- java.io.StringWriter
try
{
InputStream in = new DataInputStream(new FileInputStream("test.txt"));
}catch (FileNotFoundException e)
{
e.printStackTrace();
}
这是一个典型的Decorator模式的使用, FileOutputStream相当于Component,DataOutputStream就是一个Decorator。