意图: 动态地给一个对象添加一些额外的职责. 就增加功能来说, Decorator模式相比生成子类更为灵活.
问题: 你需要使用的对象执行你要求的基本功能. 但是, 你可能需要为这个对象添加某些功能, 这些附加功能可能发生在对象的基础功能之前或之后.
效果: 被添加的功能属于小的对象. 好处是可以在ConcreteComponent对象的功能之前或之后动态添加功能. 注意: 虽然一个装饰者可以在被装饰者之前或之后添加功能,但对象链总是以ConcteteComponent对象结束.
示例:
我们需要写一封信,但是有时候我想给这封信添加背景和边框效果,有时候只需要正文或边框或背景中的一种或任意组合(动态地给对象添加职责).如下图方式实现:
想要边框和背景及正文的信时可以这样调用(注意此处BorderDecoratorLetter 和 BackgroundDecoratorLetter 实例化顺序可以改变):
new BorderDecoratorLetter(new BackgroundDecoratorLetter(new WriteLetter())).write();
想要边框和正文时可以这样调用: new BackgroundDecoratorLetter(new WriteLetter()).write();
只想要正文时可以这样调用: new WriteLetter().write();
实例2: 打印票据: 有的需要打印抬头,有的需要打印脚注,不需要打印脚注,有的需要0个或多个抬头与0个或多个脚注的组合,且对打印顺序有要求.
代码见附件.
实例3:Java IO包中的装饰模式:
- protected volatile InputStream in;
- protected FilterInputStream(InputStream in) {
- this.in = in;
- }
- public int read() throws IOException {
- return in.read();
- }
<p:colorscheme colors="#ffffff,#000000,#808080,#000000,#00cc99,#3333cc,#ccccff,#b2b2b2"></p:colorscheme> new BufferedInputStream(new DataInputStream(new FileInputstream(new File("c:/a.txt"))));
DataInputStream 和 BufferedInputStream 都继承自 FilterInputStream 所以我们可以轻而易举的装饰出我们需要的流: