定义:动态将扩展功能附加到对象上,替代继承的另一种选择。类图如下:
(图片引自http://www.cnblogs.com/NeeoMeng/articles/1127974.html)
定义看起来不是很好理解,其实只要用过Java IO,我们已经在用装饰者这种设计模式了 -, -
先看看java io package里对于有关InputStream类的分布情况
上图中,FilterInputStream即可被看作Decorator Class。
照猫画虎,我们也可以编写自己的Java I/O装饰着对象了。
如实现将输入流内所有字符变为大写或者小写。我们需要做的仅仅是继承FilterInput类,覆写两个方法即可。
问题来了,为什么不直接同StreamBufferInputStream类一样继承InputStream实现转换大小写的功能呢?
其实,如果只是单纯的继承关系,那么我们想实现既用Buffer,又要让它大小写转换将怎么办呢~建个UpperCaseStringBufferInputStream同样继承InputStream? 此方法肯定不是王道,逐渐的,类会多的让人想死,Java的设计者自然也想到了这样的问题。
用装饰者模式可以轻松解决爆炸式类继承的问题,如果还有点晕,看了下面代码估计就懂了。
UpperCaseInputStream类,继承FilterInputStream
覆写InputStream里的两个主要read()方法
同理,Java I/O中的Reader类也是采用了装饰者的设计模式
Reader比InputStream相对复杂点,如果某些方法或者构造函数不知如何覆写,可参照JDK源码中同样继承Reader的相关类,如BufferedReader.
两个重要的方法,依旧是read()
LowerCaseReader类继承自FilterReader
编写个简单的测试类:
ReaderTest